django url中redirect与 reverse

redirect与reverse@TOC
django --version 2.05

1,redirect 解决的问题:## 标题

用户浏览网页的时候没有登录,自动跳转到登录页面
代码:
cms:app中的文件
urls.py文件:
from django.urls import path
from . import views

urlpatterns = [
path(’’,views.index),
path(‘login/’,views.login),
]

views.py文件:

from django.http import HttpResponse
from django.shortcuts import reverse,redirect

def index(request):
username = request.GET.get(‘username’)
if username :
return HttpResponse(“首页”)
else:
#没有登录用户,使用redirect跳转到登录页面
#这种重定向的方式是写死的url修改起来不太方便,下面介绍使用name的方式方便 #修改
return (redirect(‘login/’))

def login(request):
return HttpResponse(“登录首页”)

project项目中的文件:
urls.py文件内容:使用了include
from django.urls import path,include

urlpatterns = [
path(‘cms/’,include(‘cms.urls’)),
]

2,reverse使用:
为了方便修改URL与views的映射,会在URL.py中使用name。
代码:
cms中的url.py文件:

from django.urls import path
from . import views

urlpatterns = [
path(’’,views.index,name=‘cms’),
path(‘login/’,views.login,name=‘login’),
]

cms中的view文件:

from django.http import HttpResponse
from django.shortcuts import reverse,redirect
def index(request):
username = request.GET.get(‘username’)
if username :
return HttpResponse(“首页”)
else:
#这里从之前的’login/'修改成了login效果跟上面的相同
#使用这种方式在以后修改url的时候,只需要修改url.py当中的url内容就可以了
#这里存在疑问,因为要使用reverse。现在没有使用也没有报错
return (redirect(login))

def login(request):
return HttpResponse(“登录首页”)

下面是使用reverse的代码## 标题
代码:
cms的代码:
url.py文件:
from django.urls import path
from . import views

urlpatterns = [
path(’’,views.index,name=‘cms’),
path(‘login/’,views.login,name=‘login’),
]

view.py文件:
from django.http import HttpResponse
from django.shortcuts import reverse,redirect
def index(request):
username = request.GET.get(‘username’)
if username :
return HttpResponse(“首页”)
else:
#使用反转。
#这里使用了reverse
url = reverse(‘login’)
return (redirect(url))

def login(request):
return HttpResponse(“后台登录首页”)

*在使用name的同时,会出现新的问题,就是不同url 中如果他们的name相同的话,Django会出错。会找到其他的name=‘login’
比如前端登录的app中url也使用的 name=‘login’
这时Django就会将前端与后端搞混,为了解决这一个问题,就要使用应用命名空间。

如何混乱呢,要看在pycharm中哪个APP在上面,就是用上面的url.py中的映射。
正确的代码应该这么写:
cms中url.py文件:

from django.urls import path
from . import views
#app_name
app_name = ‘cms’
urlpatterns = [
path(’’,views.index,name=‘cms’),
path(‘sigin/’,views.login,name=‘login’),
]

cms中view文件:
from django.http import HttpResponse
from django.shortcuts import reverse,redirect
def index(request):
username = request.GET.get(‘username’)
if username :
return HttpResponse(“首页”)
else:
#reverse的写法
url = reverse(‘cms:login’)
return (redirect(url))

def login(request):
return HttpResponse(“后台登录首页”)

3,reverse扩展:

3.1含参数的reverse
book中的url.py文件

from django.urls import path
from . import views
app_name = ‘book’
urlpatterns = [
path(’’,views.index,name=‘index’),
path(‘sigin/’,views.login,name=‘login’),
path(‘detail/<detail_id>’,views.detail,name=‘detail’),
]

view.py文件代码:
from django.http import HttpResponse
from django.shortcuts import reverse,redirect
def index(request):
username = request.GET.get(‘username’)
if username :
return HttpResponse(“首页”)
else:
#在使用reverse时使用了kwargs参数。后面以字典的形式来传递参数变量
#如果有多个参数直接在字典里面添加参数就可以了
url = reverse(‘book:detail’,kwargs={‘detail_id’:1})
#结果是反转成detail_id = 1
return (redirect(url))

def login(request):
return HttpResponse(“图书登录首页”)

def detail(request,detail_id):
test = “你的图书id是:%s” % detail_id
return HttpResponse(test)

3.2用户没有登录跳转到登录页面,并且在登录成功之后,跳转回之前的浏览页面或者首页。
book中view.py文件:
from django.http import HttpResponse
from django.shortcuts import reverse,redirect
def index(request):
username = request.GET.get(‘username’)
if username :
return HttpResponse(“首页”)
else:
#跳转回首页
url = reverse(‘book:login’) + “?next=/”
return (redirect(url))

def login(request):
return HttpResponse(“图书登录首页”)

def detail(request,detail_id):
test = “你的图书id是:%s” % detail_id
return HttpResponse(test)

猜你喜欢

转载自blog.csdn.net/jiating167168/article/details/89180778