2014-01-10 208 views
2

因为'code'是以下MethodView类的get方法的参数,所以当我调用url_for('c',code ='O7A')时,我期望结果网址为:/ C/O7Aflask url_for()将查询字符串当作查询字符串

而不是预期的价值,我看到的是:?/ 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() 

回答

3

你犯了一个错误,瓶的新问题实际上会抛出一个错误让你知道它。当我跑这与瓶10.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')时,你提供的第一个参数是“端点”。基本上,它是一个唯一标识URL规则的字符串。

大多数时候,你并没有真正指定端点,因为Flask神奇地为你做了这个;如果您不提供端点,则Flask将使用传递给view_func参数的函数的名称。在你的情况下,你正在使用MethodView帮手,所以实际上,端点是你传递给as_view的参数。因此,当你做..

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

...你说你要定义一个路线/c/<code>,用指定的视图FUNC,只允许使用GET方法途径上的请求。由于您没有指定端点,因此Flask会为其分配一个端点(参数as_viewc

接下来你有这样的....

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')