flask url_for()将参数视为查询字符串

2024-10-01 15:36:09 发布

您现在位置:Python中文网/ 问答频道 /正文

因为'code'是下面MethodView类C的get方法的参数,所以当我为('C',code='O7A')调用url_时,我希望得到的url是:/C/O7A

我看到的不是期望值,而是:/c/?代码=O7A

from flask import Flask, url_for
from flask.views import MethodView

app = Flask(__name__)


class B(MethodView):

    def get(self):
        return 'ok'

    def post(self):
        print url_for('c', code='O7A')
        return 'ok'

app.add_url_rule('/b',
                 view_func=B.as_view('b'),
                 methods=['GET', 'POST'])

class C(MethodView):

    def get(self, code):
        return 'ok'

    def post(self):
        return 'ok'

app.add_url_rule('/c/<code>',
                 view_func=C.as_view('c'),
                 methods=['GET'])
app.add_url_rule('/c/',
                 view_func=C.as_view('c'),
                 methods=['POST'])

print app.url_map

if __name__ == "__main__":
    app.run()

Tags: selfviewaddappurlgetreturndef
1条回答
网友
1楼 · 发布于 2024-10-01 15:36:09

你犯了一个错误,新一期的烧瓶实际上会抛出一个错误让你知道。当我用Flask10.1运行这个程序时,我得到以下错误:

Traceback (most recent call last):
  File "flask_app.py", line 33, in <module>
    methods=['POST'])
  File "/home/mark/temp/test/local/lib/python2.7/site-packages/flask/app.py", line 62, in wrapper_func
    return f(self, *args, **kwargs)
  File "/home/mark/temp/test/local/lib/python2.7/site-packages/flask/app.py", line 984, in add_url_rule
    'existing endpoint function: %s' % endpoint)
AssertionError: View function mapping is overwriting an existing endpoint function: c

问题在于端点,尤其是如何命名它们。当您执行url_for('c', code='O7A')操作时,您提供的第一个参数是“endpoint”。基本上,它是唯一标识URL规则的字符串。在

大多数情况下,实际上并不指定端点,因为Flask神奇地为您指定端点;如果不提供端点,Flask将使用传递给view_func参数的函数名。在您的例子中,您使用的是MethodView帮助器,所以实际上,端点是传递给as_view的参数。因此,当你这么做的时候。。在

^{pr2}$

…您的意思是要用指定的视图函数定义一个路由/c/<code>,并且只允许使用GET方法在该路由上请求。因为您没有指定一个端点,Flask给它指定了一个端点(参数as_view)的c。在

下一个是这个。。。。在

app.add_url_rule('/c/',
                 view_func=C.as_view('c'),
                 methods=['POST'])

…几乎是一样的。因此,它还尝试定义此路由,使其端点为c。这意味着新端点将覆盖旧端点!在

要解决这个问题,您应该选择不同的端点名称,如下所示。。。在

app.add_url_rule('/c/<code>',
                 view_func=C.as_view('c_GET'),
                 methods=['GET'])
app.add_url_rule('/c/',
                 view_func=C.as_view('c_POST'),
                 methods=['POST'])

然后,当你做你的url_for调用时,你可以做。。。在

print url_for('c_GET', code='O7A')

相关问题 更多 >

    热门问题