编程语言
首页 > 编程语言> > python-Django-视图,网址怪异

python-Django-视图,网址怪异

作者:互联网

我注意到Django处理我的网址格式的行为很奇怪.用户应该登录,然后重定向到其个人资料页面.我也可以让用户编辑其个人资料.

这是我其中一个应用程序的URL模式:

urlpatterns=patterns('student.views',
    (r'profile/$', login_required(profile,'student')),
    (r'editprofile/$', login_required(editprofile,'student')),
)

这是针对一个名为Student的应用程序.如果用户转到/ student / profile,则他们应该获得个人资料视图.如果他们转到/ student / editprofile,则应该获得editprofile视图.我设置了一个名为login_required的函数,该函数对用户进行了一些检查.这比我仅使用注释所能处理的要复杂一些.

这是login_required:

def login_required(view,user_type='common'):
    print 'Going to '+str(view)
    def new_view(request,*args,**kwargs):
        if(user_type == 'common'):
            perm = ''
        else:
            perm = user_type+'.is_'+user_type
        if not request.user.is_authenticated():
            messages.error(request,'You must be logged in.  Please log in.')
            return HttpResponseRedirect('/')
        elif request.user.is_authenticated() and user_type != 'common' and not request.user.has_perm(perm):
            messages.error(request,'You must be an '+user_type+' to visit this page.  Please log in.')
            return HttpResponseRedirect('/')
        return view(request,*args,**kwargs)
    return new_view

无论如何,奇怪的是,当我访问/ student / profile时,即使我到达正确的页面,login_required也会打印以下内容:

Going to <function profile at 0x03015DF0>
Going to <function editprofile at 0x03015BB0>

为什么要同时打印?为什么要尝试同时访问两者?

甚至更奇怪的是,当我尝试访问/ student / editprofile时,配置文件页面是加载的页面,它的打印内容是:

Going to <function profile at 0x02FCA370>
Going to <function editprofile at 0x02FCA3F0>
Going to <function view_profile at 0x02FCA4F0>

view_profile是完全不同的应用程序中的功能.

解决方法:

这两种模式:

(r'profile/$', login_required(profile,'student')),
(r'editprofile/$', login_required(editprofile,'student')),

两者都符合http:// your-site / student / editprofile.

尝试:

(r'^profile/$', login_required(profile,'student')),
(r'^editprofile/$', login_required(editprofile,'student')),

Django使用模式匹配最先的视图(see number 3 here).

标签:django-urls,python,django
来源: https://codeday.me/bug/20191023/1913960.html