【问题标题】:Using request args in Flask for a variable URL在 Flask 中使用请求参数作为变量 URL
【发布时间】:2017-03-15 02:53:09
【问题描述】:

我的目标是运行一个 Flask 应用程序,该应用程序将获得一个这种形式的 URL,其中 id 不同:

http://localhost:5000/Longword/game?firstid=123&secondid=456&thirdid=789

并返回一个简单的页面输出类似

First id = 123, second id = 456, third id = 789

我运行这个脚本,当在示例URL 中进行硬编码时,我无法获取请求参数以返回除无之外的任何内容。我已经尝试将 int 格式化为字符串和其他类似的东西 - 在任何情况下我都无法让请求 args 工作。

import os
import json
from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/')
def main():
    return "on main home page"

@app.route('/longword/gameid=123&playerid=456')
def Longword():
    user = request.args.get('gameid')
    return "got hardcode %d" % gameid

我的第二个问题将在我可以获取请求参数后得到解决,即我无法配置route() 以处理变量URLs。我只能通过将页面硬编码到路由中来加载页面。我单独尝试使用会话来执行此操作,但同样不成功。

【问题讨论】:

  • 第一次使用route('/longword/') 而不使用?....。然后尝试http://localhost:5000/longword/?gameid=123&playerid=456。顺便说一句:你得到user = ,但后来你使用不存在的gameid。在调试模式下运行代码以查看更多信息。

标签: python flask


【解决方案1】:

不要混淆查询参数和路径参数。

路径参数

路径参数是URLpath部分中的变量。

@app.route('/longword/game_id/')
def longword(game_id):
    [...]

您可以选择指定此类参数的类型:

@app.route('/longword/<int:game_id>/')
def longword(game_id):
    [...]

要调用该函数,您需要 GET

http://localhost:5000/longword/123/

那些参数不能是可选的(除非你声明另一个没有它们的路由)。参数没有在 URL 中命名,但参数/值的关联是没有歧义的。想想位置参数

查询参数

查询参数在查询字符串中(在?之后)。

@app.route('/longword/')
def longword(game_id):
    game_id = request.args.get('gameid')
    return "got hardcode %d" % game_id

在这种情况下,参数对于路由来说是未知的。您可以从请求对象中获取它们。请注意,这里没有验证,因此您必须涵盖它们丢失或类型错误的情况。

要调用该函数,您需要GET

http://localhost:5000/longword/?gameid=123&playerid=456

查询参数可以按任何顺序提供,它们可以是可选的,具体取决于您在函数中执行的操作。想想关键字参数

注意:要验证您的函数参数,您可能需要查看webargs

【讨论】:

    【解决方案2】:

    你需要route('/longword/')?之后不带参数

    然后你可以在?之后使用参数运行

    http://localhost:5000/longword/?gameid=123&playerid=456
    

    在函数中,您可以使用 request.args.get() 获取此参数

    @app.route('/longword/')
    def longword():
    
        gid = request.args.get('gameid')
        pid = request.args.get('playerid')
    
        return "GID: %s  PID: %s" % (gid, pid)
    

    最后一件事:即使您发送数字,参数也是字符串,因此您需要 %s 而不是 %d


    顺便说一句:你也可以运行这个 url 而无需一些参数,即。

    http://localhost:5000/longword/?gameid=123
    http://localhost:5000/longword/?playerid=456
    http://localhost:5000/longword/
    

    你可以用request.args.get()设置默认值

        gid = request.args.get('gameid', 'default gameid')
        pid = request.args.get('playerid', 'default playerid')
    

    如果你不使用自己的默认值,那么request.args.get() 将使用None

        gid = request.args.get('gameid')
        pid = request.args.get('playerid')
    
        if not gid or not pid:
            return "You forgot gameid or playerid"
    
        return "GID: %s  PID: %s" % (gid, pid)
    

    【讨论】:

    • 是的,所以我的错误是我没有在“?”之前给出路由所有内容所以我将第二条路线更改为 _italic_@app.route('/longword/game/') 并且它起作用了。 @Jérôme 下面的评论很好地提供了更多背景信息。谢谢你们!
    猜你喜欢
    • 2019-01-17
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2020-12-22
    • 2011-09-22
    相关资源
    最近更新 更多