質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

572閲覧

VIEW関数を追加し実行したらエラーとなる

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/04/15 01:45

以下で、def account(user_id):View関数を作成し実行したとこと、エラーとなってしまいます。
コードの見直しも行ってみましたが、間違っているようでもないのです。
他に何か調べることや、見直し箇所をご教示いただければと思います。

python

1# app.py 2 3from flask import Flask, render_template, url_for, redirect, session, flash, request 4from flask_wtf import FlaskForm 5from wtforms import ValidationError, StringField, PasswordField, SubmitField 6from wtforms.validators import DataRequired, Email, EqualTo 7import os 8from flask import Flask 9from flask_sqlalchemy import SQLAlchemy 10from flask_migrate import Migrate 11from datetime import datetime 12from pytz import timezone 13 14app = Flask(__name__) 15 16app.config['SECRET_KEY'] = 'mysercretkey' 17 18basedir = os.path.abspath(os.path.dirname(__file__)) 19app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.sqlite' 20app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 21db = SQLAlchemy(app) 22Migrate(app, db) 23 24 25from sqlalchemy.engine import Engine 26from sqlalchemy import event 27 28@event.listens_for(Engine, "connect") 29def set_sqlite_pragma(dbapi_connection, connection_record): 30 cursor = dbapi_connection.cursor() 31 cursor.execute("PRAGMA foreign_keys=ON") 32 cursor.close() 33 34 35class User(db.Model): 36 37 __tablename__ = 'users' 38 39 id = db.Column(db.Integer, primary_key = True) 40 email = db.Column(db.String(64), unique=True, index=True) 41 username = db.Column(db.String(64), unique=True, index=True) 42 password_hash = db.Column(db.String(128)) 43 administrator = db.Column(db.String(1)) 44 45 post = db.relationship('BlogPost', backref='author', lazy='dynamic') 46 47 def __init__(self,email, username, password_hash, administrator): 48 self.email = email 49 self.username = username 50 self.password_hash = password_hash 51 self.administrator = administrator 52 53 def __repr__(self): 54 return f"UserName: {self.username}" 55 56class BlogPost(db.Model): 57 __tablename__ = 'blog_post' 58 id = db.Column(db.Integer, primary_key = True) 59 user_id = db.Column(db.Integer, db.ForeignKey('users.id')) 60 date = db.Column(db.DateTime, default=datetime.now(timezone('Asia/Tokyo'))) 61 title = db.Column(db.String(140)) 62 text = db.Column(db.Text) 63 summary = db.Column(db.String(140)) 64 featured_image = db.Column(db.String(140)) 65 66 def __init__(self, title, text, featured_image, user_id, summary): 67 self.title = title 68 self.text = text 69 self.featured_image = featured_image 70 self.user_id = user_id 71 self.summary = summary 72 73 def __repr__(self): 74 75 return f"PostID: {self.id}, Title: {self.title}, Author: {self.author} \n" 76 77 78 79class RegistrationForm(FlaskForm): 80 email = StringField('メールアドレス', validators=[DataRequired(), Email(message='正しいメールアドレスを入力してください')]) 81 username = StringField('ユーザー名', validators=[DataRequired()]) 82 password = PasswordField('パスワード', validators=[DataRequired(), EqualTo('pass_confirm', message='パスワードが一致していません')]) 83 pass_confirm = PasswordField('パスワード(確認)', validators=[DataRequired()]) 84 submit = SubmitField('登録') 85 86 def validate_username(self, field): 87 if User.query.filter_by(username=field.data).first(): 88 raise ValidationError('入力されたユーザー名は既に使われています。') 89 90 def validate_email(self, field): 91 if User.query.filter_by(email=field.data).first(): 92 raise ValidationError('入力されたメールアドレスは既に使われています。') 93 94 95class UpdateUserForm(FlaskForm): 96 email = StringField('メールアドレス', validators=[DataRequired(), Email(message='正しいメールアドレスを入力してください')]) 97 username = StringField('ユーザー名', validators=[DataRequired()]) 98 password = PasswordField('パスワード', validators=[DataRequired(), EqualTo('pass_confirm', message='パスワードが一致していません')]) 99 pass_confirm = PasswordField('パスワード(確認)') 100 submit = SubmitField('更新') 101 102 # 処理を行う場合は、user_idが必要になる 103 def __init__(self, user_id, *args, **kwargs): 104 # 継承元のクラスを残して、必要な処理を行うために必要な記述 105 super(UpdateUserForm, self).__init__(*args, **kwargs) 106 self.id = user_id 107 108@app.route('/register', methods=['GET', 'POST']) 109def register(): 110 form = RegistrationForm() 111 if form.validate_on_submit(): 112 113 user = User(email=form.email.data, username=form.username.data, password_hash=form.password.data, administrator="0") 114 db.session.add(user) 115 db.session.commit() 116 117 flash('ユーザーが登録されました') 118 return redirect(url_for('user_maintenance')) 119 return render_template('register.html', form=form) 120 121@app.route('/user_maintenance') 122def user_maintenance(): 123 page = request.args.get('page', 1, type=int) 124 users = User.query.order_by(User.id).paginate(page=page, per_page=10) 125 return render_template('user_maintenance.html', users=users) 126 127# 以下のVIEW関数を追記し、app.pyを実行したらエラーとなってしまう。 128@app.route('<int:user_id>/account', methods=['GET', 'POST']) 129def account(user_id): 130 # 対象ユーザーが見つからな場合、404を表示する。 131 user = User.query.get_or_404(user_id) 132 form = UpdateUserForm(user_id) 133 # 更新処理 134 if form.validate_on_submit(): 135 # formに格納されたユーザー名やメールアドレスをモデルに格納 136 user.username = form.username.data 137 user.email = form.email.data 138 # PWはformに入力された場合だけ更新するため、formに入力されたか確認を行う 139 if form.password.data: 140 user.password_hash = form.password.data 141 db.session.commit() 142 flash('ユーザーアカウントが更新されました') 143 return redirect(url_for('user_maintenance')) 144 # 最初にaccountが呼び出された場合 145 elif request.method == 'GET': 146 # DBから取得したユーザー名やメールアドレスをformに格納 147 form.username.data = user.username 148 form.email.data = user.email 149 return render_template('account.html', form=form) 150 151 152if __name__ == '__main__': 153 app.run(debug=True) 154

エラー内容

txt

1Traceback (most recent call last): 2 File "C:\work\dev\Flask\FLASK_FORM\app.py", line 126, in <module> 3 def account(user_id): 4 File "C:\Users\test\anaconda3\envs\flask_env\lib\site-packages\flask\scaffold.py", line 439, in decorator 5 self.add_url_rule(rule, endpoint, f, **options) 6 File "C:\Users\test\anaconda3\envs\flask_env\lib\site-packages\flask\scaffold.py", line 57, in wrapper_func 7 return f(self, *args, **kwargs) 8 File "C:\Users\test\anaconda3\envs\flask_env\lib\site-packages\flask\app.py", line 1083, in add_url_rule 9 rule = self.url_rule_class(rule, methods=methods, **options) 10 File "C:\Users\test\anaconda3\envs\flask_env\lib\site-packages\werkzeug\routing.py", line 698, in __init__ 11 raise ValueError("urls must start with a leading slash") 12ValueError: urls must start with a leading slash 13

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2023/04/15 03:55

urls must start with a leading slash は読んでないのでしょうか
guest

回答1

0

ベストアンサー

コメントで指摘されていますが、routeに指定しているURLが不正です。

python

1@app.route('<int:user_id>/account', methods=['GET', 'POST'])

投稿2023/04/15 04:48

TakaiY

総合スコア12657

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問