2015-10-03 33 views
1

我正在使用Django REST框架構建一個新的Django項目並構建一個API。我試圖啓用的視圖,只有當DEBUG=True可以序列化當前urlpatterns並將它們作爲JSON發回時,前端開發人員才能使用它。將Django的urlpatterns轉換爲字典

我正在尋找一個乾淨的方式來做到這一點。我可以遍歷每個模式,但模式可能會有無限數量的子模式,所以我需要一些可以處理該模式的方法。

是否有內置的東西呢?除了蠻力強制URL之外的任何方式?我可以從頭開始編寫它,但由於Django 404頁面包含此信息,因此必須有更好的方法。我還會深入研究那些源代碼。

注意:複雜性和安全性不是問題,因爲整個視圖僅在系統處於DEBUG時纔可用。

我在尋找的結果是這樣的:

{ 
    "^admin/": [ 
        "^$ [name='index']", 
        "^admin/ ^login/$ [name='login']", 
        "^admin/ ^logout/$ [name='logout']", 
        ... 
       ], 
    "^auth/": [ ... ] 
    . 
    . 
    . 
} 
+1

[Django管理文檔(https://docs.djangoproject.com/en/1.8/ref/contrib/admin/admindocs/)已做一些非常相似的事。一探究竟! – zanderle

+0

謝謝!絕對是一個更完整的選項(請參閱我的答案),但是正在尋找一種不需要向其他區域添加更多代碼的方法。將來考慮這個! –

回答

1

一些挖後,dir()pdb,我想出了一個解決方案。它使用遞歸策略搜索URLS直到找到RegexURLPattern,並在那裏終止。這適用於我的URL設置,但我不確定它對於複雜的URL配置有多強大。仍然有興趣聽取其他想法!

def recursively_build__url_dict(d, urlpatterns): 
    for i in urlpatterns: 
     if isinstance(i, RegexURLResolver): 
      d[str(i.__dict__['_regex'])] = {} 
      recursively_build__url_dict(
       d[str(i.__dict__['_regex'])], i.url_patterns 
      ) 

     elif isinstance(i, RegexURLPattern): 
       d[str(i.regex.pattern)] = i.callback.__name__ 

編輯:我已經把這個變成一個gist