从请求uri获取视图功能?

时间:2010-06-20 23:29:54

标签: django

鉴于像/home/这样的uri,我希望找到与之对应的视图函数,最好采用app.views.home<app_label>.<view_func>之类的形式。有没有能给我这个功能?

5 个答案:

答案 0 :(得分:30)

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

from django.core.urlresolvers import resolve

myfunc, myargs, mykwargs = resolve("/hello_world/")
mymodule = myfunc.__module__

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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

您将需要执行以下操作:

from django.urls import resolve

myfunc, myargs, mykwargs = resolve("/hello_world/")
mymodule = myfunc.__module__

答案 3 :(得分:1)

1。生成带有所有具有相应视图功能的URL的文本文件

./manage.py show_urls --format pretty-json --settings=<path-to-settings> > urls.txt

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

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

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

答案 4 :(得分:0)

基于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作为模板并传入请求上下文。