2014-01-10 253 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')