【问题标题】:Get view function from request uri?从请求 uri 获取视图函数?
【发布时间】:2011-03-06 02:39:36
【问题描述】:

给定一个像/home/ 这样的uri,我想找到它对应的视图函数,最好是app.views.home<app_label>.<view_func> 这样的形式。有什么功能可以给我这个吗?

【问题讨论】:

    标签: django


    【解决方案1】:

    可以使用django提供的resolve方法来获取函数。您可以使用返回函数的__module__ 属性来获取应用标签。这将返回一个类似project.app.views 的字符串。所以是这样的:

    from django.urls import resolve
    
    myfunc, myargs, mykwargs = resolve("/hello_world/")
    mymodule = myfunc.__module__
    

    【讨论】:

      【解决方案2】:

      从 Django 1.3(2011 年 3 月)开始,urlresolvers 模块中的 resolve 函数返回一个 ResolverMatch 对象。它提供对已解析 URL 匹配的所有属性的访问,包括视图可调用路径。

      >>> from django.core.urlresolvers import resolve
      >>> match = resolve('/')
      >>> match.func
      <function apps.core.views.HomeView>
      >>> match._func_path
      'apps.core.views.HomeView'
      

      【讨论】:

        【解决方案3】:

        从 Django 2.0 开始,django.core.urlresolvers 模块已移至 django.urls

        您需要这样做:

        from django.urls import resolve
        
        myfunc, myargs, mykwargs = resolve("/hello_world/")
        mymodule = myfunc.__module__
        

        【讨论】:

          【解决方案4】:

          1.生成一个包含所有 URL 和对应视图函数的文本文件

          ./manage.py show_urls --format pretty-json --settings=&lt;path-to-settings&gt; &gt; urls.txt

          示例 ./manage.py show_urls --format pretty-json --settings=settings2.testing &gt; urls.txt

          2。在输出文件中查找您的 URL urls.txt

              {
                  "url": "/v3/affiliate/commission/",
                  "module": "api.views.affiliate.CommissionView",
                  "name": "affiliate-commission",
              },
          

          【讨论】:

            【解决方案5】:

            基于KillianDS's answer,这是我的解决方案:

            from django.core.urlresolvers import resolve
            
            def response(request, template=None, vars={}):
                if template is None:
                    view_func = resolve(request.META['REQUEST_URI'])[0]
                    app_label = view_func.__module__.rsplit('.', 1)[1]
                    view_name = view_func.__name__
                    template = '%s.html' % os.path.join(app_label, view_name)
                return render_to_response(template, vars, context_instance=RequestContext(request))
            

            现在您可以在视图函数结束时调用return response(request),它会自动加载app/view.html 作为模板并传入请求上下文。

            【讨论】:

            • 鉴于您已经有请求,您可以简单地执行“request.resolver_match”而不是调用 resolve
            【解决方案6】:

            所有其他人只关注视图的模块或字符串表示。但是,如果您出于某种原因想直接访问视图对象,这可能会很方便

            resolve('the_path/').func.cls
            

            这给出了视图对象本身,这适用于基于类的视图,不过我还没有在基于函数的视图上测试它。

            【讨论】:

              猜你喜欢
              • 2011-07-31
              • 1970-01-01
              • 2012-11-08
              • 1970-01-01
              • 1970-01-01
              • 2017-10-21
              • 2021-08-14
              • 2015-07-12
              相关资源
              最近更新 更多