【问题标题】:Django url.py without method names没有方法名称的 Django url.py
【发布时间】:2011-03-07 15:01:07
【问题描述】:

在我的 Django 项目中,我的 url.py 模块看起来像这样:

urlpatterns = patterns('',
    (r'^$', 'web.views.home.index'),
    (r'^home/index', 'web.views.home.index'),
    (r'^home/login', 'web.views.home.login'),
    (r'^home/logout', 'web.views.home.logout'),
    (r'^home/register', 'web.views.home.register'),
)

有没有办法简化这一点,以便我不需要为我的视图中的每个方法输入一个条目?像这样的东西会很好:

urlpatterns = patterns('',
    (r'^$', 'web.views.home.index'),
    (r'^home/(?<method_name>.*)', 'web.views.home.(?P=method_name)'),
)

更新

既然我知道至少有一种方法可以做到这一点,那么推荐这种方法吗?或者是否有充分的理由为每个单独的方法显式创建映射?

【问题讨论】:

    标签: python django url url-pattern


    【解决方案1】:

    您可以将基于类的视图与调度程序方法一起使用:

    class MyView(object):
        def __call__(self, method_name):
            if hasattr(self, method_name):
                return getattr(self, method_name)()
    
    
        def index(self):
            ...etc...
    

    你的 urls.py 看起来像这样:

    from web.views import MyView
    urlpatterns = patterns('',
        (r'^$', 'web.views.home.index'),
        (r'^home/(?<method_name>.*)', MyView()),
    )
    

    【讨论】:

      【解决方案2】:

      可能是这样的:

      import web.views.home as views_list
      urlpatterns = patterns('',
          (r'^$', 'web.views.home.index'),
          *[(r'^home/%s' % i, 'web.views.home.%s' % i) for i in dir(views_list)]
      )
      

      【讨论】:

      • 不错!我想为了安全起见,我需要检查某种自定义装饰器(@public 或 @web_method 之类的)。
      • dir(amodule) 将包含特殊名称(前后带有双下划线),例如__file____name__ 等——你绝对要避免那些!- )。一个简单的装饰器可以显式地构建有趣的视图列表——推荐。
      猜你喜欢
      • 2017-01-24
      • 1970-01-01
      • 2021-12-30
      • 2011-01-22
      • 2010-11-21
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多