【问题标题】:How can I fix this flask routing problem in my app?如何在我的应用程序中解决此烧瓶路由问题?
【发布时间】:2019-07-24 20:07:44
【问题描述】:

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

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

只有使用“/”作为路由才能正常工作。但是,我没有设法使我的第二个发布方法页面“/page ajoutée”,因为尽管 render_template 运行良好,但 url 仍然是“/”......如果我尝试使用 bienvenue1.html 上的文本输入框页面,它仍然尝试操作我的 def text_box() 函数,我得到: werkzeug.exceptions.HTTPException.wrap..newcls: 400 Bad Request: 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)

从那几天开始,我就一直在转圈……如果有人可以提供帮助,那就太好了。

非常感谢

保罗

【问题讨论】:

  • 嗨,PGP,您介意分享一下您是如何提出请求的吗?预期的结果是什么?这会有所帮助!
  • 嗨 calestini,谢谢帮助 所以,这段代码从文本框(在 /homee 页面上)获取文本输入 def text_box(): text = request.form['text'] 它通过 url 请求发送到 API: response = requests.get(url) result=response.json() 然后我处理此结果并将其发送到 bienvenue1.html 模板。处理后的结果(来自 API 的 JSON 文件,给了我一些图片和 url 链接,我把它们放在 bienvenue1.html 模板中) 在这个 bienvenue1.html 页面上是另一个我想用来保存输入的文本框:def text_box1() : text1 = request.form['text1']
  • 对不起@PGP我的意思是你是如何从你的html发出帖子请求的。您介意分享代码或示例代码,了解您如何创建表单并提交表单吗? html 代码将有助于解决问题。
  • 啊好吧! @calestini :) 第一个这样的:
    第二个这样:

标签: python html web flask routes


【解决方案1】:

好的,所以我将尝试分解我从问题中理解的内容。

Route /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 代码,那将有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2021-11-26
    • 2021-12-31
    • 2020-11-16
    • 2019-06-06
    • 2017-02-28
    相关资源
    最近更新 更多