从请求uri获取查看功能?

问题描述:

给定一个像/home/这样的URI我想查找与此相对应的查看功能,最好是以app.views.home<app_label>.<view_func>的形式。有没有一个函数可以给我这个?从请求uri获取查看功能?

您可以使用由django提供的resolve方法来获取该函数。您可以使用返回的函数的__module__属性来获取应用程序标签。这将返回一个字符串,如project.app.views。因此,像这样:

from django.core.urlresolvers import resolve 

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

基于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)在您的视图funcs中结束,它会自动加载app/view.html作为模板并传入请求上下文。

+2

鉴于您已经有了请求,您可以简单地执行“request.resolver_match”而不是调用resolve – 2016-05-27 06:52:35

由于Django 1.3(2011年3月)模块中的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'