我有这个表单,每次我尝试将它发布到问题的底部的方法。该应用程序直接给我一个405错误。我已经通过在控制台中使用相同的方法检查了我的数据库是否正常工作。
(我删除了很多HTML,因为它只是样式和类似的东西)
<form action="/register" method="post" class="grid">
<div class="cell colspan3" style="margin-left:2%;">
<div class="input-control modern text">
<input type="email" name="email" id="email">
<span class="label">Email</span>
<span class="informer">Skriv din email</span>
<span class="placeholder">Email</span>
</div>
</div>
<div class="cell colspan3">
<div class="input-control modern text cell">
<input type="text" name="username" id="username" >
<span class="label">Brugernavn</span>
<span class="informer">Skriv dit brugernavn</span>
<span class="placeholder">Brugernavn</span>
</div>
</div>
<div class="cell colspan3">
<div class="input-control modern text cell">
<input type="password" name="password" id="password">
<span class="label">Password</span>
<span class="informer">Skriv dit password</span>
<span class="placeholder">Password</span>
</div>
</div>
<div class="cell colspan3">
<div class="input-control modern text cell">
<input type="password" name="passwordconfirm" id="passwordconfirm">
<span class="label">Gentag password</span>
<span class="informer">Skriv dit password igen.</span>
<span class="placeholder">Gentag password</span>
</div>
</div>
<div class="cell colspan3">
<label class="input-control checkbox ">
<input type="checkbox" name="accept_tos" id="accept_tos">
<span class="check"></span>
<span class="caption">Jeg accepterer hjemmesidens regler</span>
</label>
</div>
<div class="cell colspan3">
<div class="input-control cell">
<button class="button success" type="submit">Registrer</button>
</div>
</div>
</div>
</div>
</form>
我用html post表单调用的python方法:
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm(request.form)
if request.method == 'POST' and form.validate():
newUser = User(form.username.data, form.email.data, form.password.data)
db.session.add(newUser)
db.session.commit()
return render_template('login.html')
else:
return render_template('register.html')
RegistrationForm方法如下所示:
class RegistrationForm(Form):
username = StringField('username', [validators.Length(min=4, max=25)])
email = StringField('email', [validators.email, validators.Length(min=4, max=40)])
password = PasswordField('password',
[validators.Required(),
validators.EqualTo('confirm', message='Passwords skal matche hinanden.')
])
confirm = PasswordField('passwordconfirm')
accept_tos = BooleanField('Jeg accepterer regler for denne hjemmeside', [validators.Required()])
显然这些代码没有任何问题,除非你有当前应用程序的url_prefix,如:
app = Blueprint('user', __name__, url_prefix='/user/')
你有另一个url_prefix的蓝图,如:
app = Blueprint('general', __name__, url_prefix='/')
与另一个功能,如:
@app.route('/register', methods=['GET'])
在蓝图中......
并且您的表单将数据发布到'/ register'而不是'/ user / register'
如果那真的是你正在使用的代码,我不明白你为什么得到405 Unsupported Method
而不是验证错误。您需要在html表单中呈现隐藏的CSRF字段。
<form ...>
{{ form.hidden_tag() }}
这段代码还有其他问题。重定向到登录,不要从寄存器视图中呈现模板。使用form.validate_on_submit()
。不要将request.form
传递给表格。让表单呈现输入,不要自己编写html。
尝试改变
if request.method == 'POST' and form.validate():
至
if form.validate_on_submit():