如何解决我的应用中的烧瓶路由问题?

时间:2019-07-24 20:07:44

标签: python html web flask routes

我正在设置一个应用程序,该应用程序从第A页上的用户输入的单词向API发出请求,然后通过API的JSON输出获取一些数据,然后将其显示在B页上。

问题是我尝试设置Flask不需要的路由名称“ / bienvenue1”,我得到: 未找到 在服务器上找不到请求的URL。如果您手动输入网址,请检查拼写,然后重试。

仅在将“ /”作为路由时才能正常工作。但是然后,我无法使我的第二个发布方法页面“ / pageajoutée”成为可能,因为尽管render_template运作良好,但URL仍然是“ /” ...如果我尝试使用bienvenue1.html上的文本输入框页面,它仍然尝试操作我的def text_box()函数,我得到: werkzeug.exceptions.HTTPException.wrap..newcls:400错误的请求:KeyError:'text'

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_user import login_required, UserManager, UserMixin, SQLAlchemyAdapter
from flask_mail import Mail
from flask import render_template
from flask import request
from flask import jsonify
import requests 

app = Flask(__name__)

@app.route('/homee')
def index():
    return render_template("homee.html")

@app.route('/profile')
@login_required
def profile():
    return '<h1>This is the protected profile page!'

@app.route('/bienvenue1', methods=['POST'])
def text_box():
    text = request.form['text']
    # call the api
    API_KEY = "blablabla"
    url= "blablablabla".format(text)+API_KEY
    response = requests.get(url)
    result=response.json()
    result_processed=result['articles'][0:4]
    u=[]
    v=[]
    x=[]
    for i in result_processed:
        u.append(i['url'])
        v.append(i['urlToImage'])
        x.append(i['description'])
    return render_template("bienvenue1.html",lienimage0=v[0],lienimage1=v[1],lienimage2=v[2],message1=u[0],message2=u[1],message3=u[2],description0=x[0],description1=x[1],description2=x[2])

@app.route('/mesarticles')
def mesarticles():
    return render_template("mesarticlesenregistres.html")

@app.route('/pageajoutee', methods=['POST'])
def text_box1():
    text1 = request.form['text1']
    url=Two(id=1,url1='text1')
    db.session.add(url)
    db.session.commit()
    return 'article ajouté à votre liste'

if __name__ == '__main__':
    app.run(debug=True)

从那以后,我一直在圈子里转弯……如果有人能帮上大忙。

非常感谢

保罗

1 个答案:

答案 0 :(得分:0)

好的,所以我将尝试分解成我对问题的理解。

尝试访问路由/bienvenue1时不起作用

这里的原因很简单,当您尝试访问它时,您需要一个GET请求,此刻您仅在该路由中接受一个POST请求。如果同时需要GETPOST,则应将其传递给方法。另外请注意,由于您同时接收这两种方法,因此您可能要确保采取不同的操作,具体取决于您是加载页面还是提交表单。

from flask import url_for, redirect, request
@app.route('/bienvenue1', methods=('GET','POST'))
def text_box():
    if request.method == 'POST':
         ## deal with post

    ## deal with get

   ...

无法提交表单。

根据您在评论中分享的内容,以下是您要提交的表单:

<form action="." method="POST">
    <input type="text" name="text">
     <button type="submit" class="btn btn-success">
         OK</button>
</form>

不过,您正在将action设置为.。在这里,您应该写出表单应该发送到的链接,或者以烧瓶友好的方式编写:

<form action="{{url_for('text_box')}}" method="POST">
    <input type="text" name="text">
     <button type="submit" class="btn btn-success">
         OK</button>
</form>

您也可以尝试通过url结尾处的内容,至少出于测试目的。因此,基本上,您需要将表单提交到正确的action位置,这将有助于呈现其他页面。

发布后从一条路线重定向到另一条路线

如果要在提交表单后从/bienvenue1重定向到/mesarticles,则只需在text_box()函数内添加该代码即可

from flask import url_for, redirect, request

@app.route('/bienvenue1', methods=('GET','POST'))
def text_box():
    if request.method == 'POST':
         ## deal with post (get form, API, etc)
         return redirect(url_for('mesarticles'))
    ## deal with get

text_box1()也是如此。

PS 如果您可以编辑问题以添加(1)确切的期望值,然后添加(2)您的html代码,那将有所帮助