如何解决尝试更新条目但出现错误“错误的请求浏览器或代理发送了该服务器无法理解的请求”
我是python和Flask的新手,我在更新字段条目时遇到问题,我可以在用户个人资料中添加2个字段并将数据保存到其用户页面,也可以删除该条目,但是在尝试更新“提示”字段时,它以“错误请求”错误的形式返回;文件是:
app.py:
from flask import Flask,render_template,request,redirect,url_for,flash
from flask_wtf import FlaskForm
from wtforms import StringField,SubmitField,PasswordField
from flask_sqlalchemy import sqlAlchemy
from forms import RegistrationForm,LoginForm,InstrumentForm,IdeasForm
from werkzeug.urls import url_parse
from werkzeug.security import generate_password_hash,check_password_hash
from wtforms import StringField,SubmitField
from wtforms.validators import ValidationError,Datarequired,Email,EqualTo,Length
from flask_login import LoginManager,UserMixin,current_user,login_user,logout_user,login_required
from flask_bootstrap import Bootstrap
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
app.config['sqlALCHEMY_DATABASE_URI'] = 'sqlite:///Mix_Tips.db'
app.config['sqlALCHEMY_TRACK_MODIFICATIONS'] = False
app.config["TEMPLATES_AUTO_RELOAD"] = True
db = sqlAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
class User(db.Model,UserMixin):
id = db.Column(db.Integer,primary_key= True)
username = db.Column(db.String(15),index =True,unique = True)
email = db.Column(db.String(150),index = True,unique = True)
password_hash = db.Column(db.String(200))
idea = db.relationship('Ideas',backref='author',lazy='dynamic')
def __repr__(self):
return '<User {}>'.format(self.username)
return '<N'
def set_password(self,password):
self.password_hash = generate_password_hash(password)
def check_password_hash(self,password):
return check_password_hash(self.password_hash,password)
class Tips(db.Model):
Instrument = db.Column(db.String(50),primary_key = True)
Frequency_Boost = db.Column(db.String(200),unique=True)
Frequency_Cut = db.Column(db.String(200),unique = True)
Advice = db.Column(db.String(500))
class Ideas(db.Model):
id = db.Column(db.Integer,primary_key = True)
Instrument = db.Column(db.String(50))
Tips = db.Column(db.String(200))
user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
def __repr__(self):
return '<Tricks {}>'.format(self.Tips)
@app.route('/',methods=["GET","POST"])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user and user.check_password_hash(form.password.data):
login_user(user,remember=form.remember_me.data)
return redirect(url_for('user',username = form.username.data))
if user is None or not user.check_password_hash(form.password.data):
flash('Invalid username or password')
return render_template('login.html',form=form)
@app.route('/register',"POST"])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data,email=form.email.data)
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
flash('Congratulations,you are Now a registered user!')
return redirect(url_for('login'))
return render_template('register.html',title='Register',form=form)
@app.route('/user/<username>',"POST"])
@login_required
def user(username):
user = current_user
user = User.query.filter_by(username=user.username).first()
idea = Ideas.query.filter_by(user_id=user.id)
if idea is None:
idea = []
form = IdeasForm()
if request.method == 'POST' and form.validate():
New_Idea = Ideas(Instrument = form.Instrument.data,Tips = form.Tips.data,user_id=current_user.id)
db.session.add(New_Idea)
db.session.commit()
print(request.form.get('Tips'))
return render_template('user.html',user=user,form=form,idea=idea)
@app.route('/update/<int:id>',methods=['POST','GET'])
def update(id):
tip_to_update = Ideas.query.get_or_404(id)
if request.method == 'POST':
tip_to_update.Tips = request.form['Tips']
db.session.commit()
return redirect(url_for('user',username=current_user))
else:
return render_template('update.html',tip_to_update=tip_to_update)
@app.route('/delete/<int:id>')
def delete(id):
idea_to_delete = Ideas.query.get_or_404(id)
try:
db.session.delete(idea_to_delete)
db.session.commit()
return redirect(url_for('user',username=current_user))
except:
return "Problem Deleting"
@login_manager.user_loader
def load_user(id):
return User.query.get(int(id))
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('login'))
**user.html:**
{% extends 'base.html' %}
{% block content %}
<center><h1 style="color:rgb(41,15,135)">Welcome back {{current_user.username }}!</h1></center>
<center><h2 style="color:rgb(41,135)">Music Mixing Guide</h2></center>
<h3 style="color:rgb(69,67,67)">Add your Instrument and Specific Tips for Mixing below:</h3>
<form action="user" method='POST'>
{{ form.hidden_tag() }}
<p
style="color:rgb(52,52,52)">{{form.Instrument.label}} <br>
{{form.Instrument(size=30)}}
</p>
<p
style="color:rgb(52,52)">{{form.Tips.label}} <br>
{{form.Tips(size=80)}}
</p>
<p> <input class="btn btn-outline-dark" type="submit" value="Add"></p>
</form>
<br>
<h3>Your Music Mixing Tips</h3>
{% for tricks in idea %}
<ol>
<li><p style="color:rgb(41,135)"> <b><h5>Instrument:</h5></b> {{tricks.Instrument}}</li>
<p style="color:rgb(41,135)"> <b><h5>Tip:</h5></b> {{tricks.Tips}}
</ol>
<p></p> <a href="/update/{{ tricks.id }}" class=" btn btn-outline-secondary btn-sm">Update</a>
<a href="/delete/{{ tricks.id }}" class=" btn btn-outline-danger btn-sm">Delete</a>
<br>
{% endfor %}
<br>
<br>
<br>
<a href="{{ url_for('logout') }}" class="btn btn-dark btn-sm">Log Out</a>
{% endblock %}
**update.html:**
{% extends 'base.html' %}
{% block content %}
<div class='container'></div>
<h2>Update Mix Tip</h2>
<br>
<form action="/update/{{tip_to_update.id}}" method="POST">
<input type="text" placeholder="Tip" Tips="Tips" class="form-control" value="{{tip_to_update.Tips}}"> <br> <br>
<input type="submit" value="Update" class="btn btn-secondary btn-sm">
</form>
</div>
{% endblock %}
**forms.py**
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,BooleanField,SelectField
from wtforms.validators import ValidationError,Length
from flask_sqlalchemy import sqlAlchemy
class RegistrationForm(FlaskForm):
username=StringField('Username',validators=[Datarequired(),Length(min=4,max=15)])
email=StringField('Email',Email(message='Invalid Email'),Length(max=150)])
password=PasswordField('Password',max=150)])
Repeat_password=PasswordField('Repeat Password',EqualTo('password')])
submit=SubmitField('Register')
class LoginForm(FlaskForm):
username=StringField('Username',max=15)])
password=PasswordField('Password',max=150)])
remember_me=BooleanField('Remember Me')
submit=SubmitField('Sign In')
class InstrumentForm(FlaskForm):
Instrument= SelectField('Instrument',choices=[('Voice'),('Acoustic guitar'),('Electric guitar'),('Bass guitar'),('Piano'),('Bass Drum'),('Snare Drum'),('HiHats'),('Toms'),('Cymbals'),('Brass')])
class IdeasForm(FlaskForm):
Instrument = StringField('Instrument')
Tips = StringField('Tips')
submit= SubmitField('Add')
def validate_username(self,username):
user = User.query.filter_by(username=username.data).first()
if user is not None:
raise ValidationError('Please use a different username.')
def validate_email(self,email):
user = User.query.filter_by(email=email.data).first()
if user is not None:
raise ValidationError('Please use a different email address.')
我认为这可能与app.py中的“ request.form ['Tips']行有关,但我想确定并知道如何解决它。
谢谢
解决方法
欢迎使用Mac。我不确定错误消息,但是据我所知,您将需要重新处理数据库模型,以精确化您的关系。这是一个示例:
class Ideas(db.Model):
id = db.Column(db.Integer,primary_key = True)
instrument = db.Column(db.String(50))
tips = db.relationship("Tips",lazy="dynamic")
user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
看看文档:{{3}}
我也推荐来自Miguel Grinberg的这个烧瓶大型教程:https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
,感谢您的建议,我终于找到了问题所在,更新路由中的“ tip_to_update.Tips = request.form ['Tips']”行应改为“ tip_to_update.Tips = form.Tips.data” ,因为我使用了Flask Form方法在我的注册路线中收集数据,所以它不接受request.form方法。当用户想要更新提示时,我仍然无法显示在占位符中输入的数据,它会打开带有空白占位符字段的更新页面以进行更新,但是我希望输入的提示中的文本显示为,所以用户可以进行一些更改,而不必再次键入整个提示。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。