2013-01-15 25 views
0

我寫的燒瓶網站,我想有這樣的路線:蟒蛇/瓶:路由和動態第一部分

@app.route('/') 
@app.route('/<page_id>') 
@app.route('/<page_id>/<subpage_id>') 
def page(page_id=None, subpage_id=None): 
    ... 

雖然看起來這在理論上應該工作,它看起來像這樣實際上會破壞位於根靜態/目錄中的靜態資源。我假設這是因爲我的動態路由實際上匹配'static/style.css',因此覆蓋了靜態文件的正常處理程序。

有沒有辦法解決這個問題?如果我檢測到page_id =='static',是否有'靜態'處理程序可以將請求轉發給我?

編輯:這裏是工作示例

@app.route('/<page_id>/<subpage_id>/<subsubpage_id>') 
def xxx(page_id=None, subpage_id=None, subsubpage_id=None): 
    return 'hello' 

如果你打開http://127.0.0.1:5000/static/css/style.css現在你應該得到一個「你好」,而不是文件。

+0

如果這些變量保證是整數,您可以在路線中指定它,並且這應該對您有所幫助。否則,我不知道爲什麼會發生這種情況。 –

+0

不幸的是他們不是。我剛剛添加了一個示例,如果將其插入到通常的Flask骨架中,則CSS的URL將不再起作用。 – Nils

+2

你是從字面上擷取'/ //'?如果你有一個功能做一切,那麼使用路由的意義何在? – Eevee

回答

4

關於你的問題的根源:

是。我在我的數據庫中有頁面對象,當調用方法時,我會根據page_id/subpage_id/subsubpage_id加載和顯示它們。有一個更好的方法嗎?我正在考慮在應用程序初始化時爲每個頁面添加單獨的路線,但我找不到與url_for結合使用的好方法。

您可以直接使用app.add_url_rule註冊路由處理程序。默認情況下,它將使用url_for的函數名稱,但您可以通過傳遞參數endpoint來覆蓋該名稱。

因此,也許你有這樣的事情:

from functools import partial 

def actual_handler(page): 
    return u'hello' 

for page in session.query(Page): 
    route = u'/{0}/{1}/{2}'.format(page.id1, page.id2, page.id3) 
    app.add_url_rule(
     route, 
     page.name, # this is the name used for url_for 
     partial(actual_handler, page=page), 
    ) 

獲取會話可能會或可能不會是棘手的,並且可能涉及或不涉及喜歡手動調用session.remove()工作;我以前沒有嘗試在Flask處理程序之外使用SQLAlchemy。假設你首先使用SQLA。

另請參閱documentation on route handling

至於優先於靜態文件的路由的原始問題,我真的不知道;根據我對Flask和Werkzeug文檔的閱讀,這不應該發生。如果您仍希望通過手動提供靜態文件來解決此問題,則send_from_directory可能會有所幫助。無論如何,你的網絡服務器可能直接在生產環境中提供靜態文件,所以它可能不值得上面的元編程。 PS:事後的想法;如果整個網站位於數據庫中,Pyramid's traversal可能更適合。它動態地一次檢查路徑組件,而不是擁有靜態路由的固定列表。

+0

我想我得到了這個工作,謝謝!但我不明白爲什麼我需要參加會議。爲什麼我不能在'Page.query.all()中執行'db = SQLAlchemy(app)'然後'':''? – Nils

+0

你不,真的; 'Page.query'是'session.query(Page)'的快捷方式。我只是儘可能地使用vanilla SQLA方法;這對我來說沒有意義,一張桌子可以查詢自己:) – Eevee

1

這是一個可怕的技巧,但你很可能只是做一個類似於:

@app.route('/<page_id>/<subpage_id>/<subsubpage_id>') 
def xxx(page_id=None, subpage_id=None, subsubpage_id=None): 
    if page_id == 'static': # or whatever the path is to your assets 
     # make a response where you've filled the request yourself 
    return 'hello' 
+0

是的,正如我在我原來的帖子中提到的,如果我知道靜態資源請求的默認處理程序是什麼,我可以做到這一點,以便我可以正確地轉發請求。你知道嗎? – Nils