因为url是经常变化的。如果在代码中写死可能会经常改代码。给url取个名字,以后使用url的时候就使用他的名字进行反转就可以了,就不需要写死url了。
示例:
在项目中新建一个front的app,views.py中写入一下代码:
from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import redirect,reverse
#redirect()重定向到某个url
#reverse()反转
# Create your views here.
def index(request):
username = request.GET.get('username')
if username:
return HttpResponse('前台首页')
else:
login_url = reverse('login')#urls.py中的url的name
print(login_url)#在控制台可查看打印的东西
return redirect(login_url)
def login(request):
return HttpResponse('前台登录页面')
意思是当用户访问前台首页时,如果没有传递一个用户名,那么将跳转至登录页面。
front中创建一个urls.py,写入一下代码
from django.urls import path
from . import views
urlpatterns = [
path('',views.index,name = 'index'),
path('login/',views.login,name = 'login'),
]
主urls.py中写入
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('front.urls')),
]
当我们输入
http://127.0.0.1:8000
就会自动跳转至
http://127.0.0.1:8000/login
而当我们传入一个用户名才能跳转至“前台首页”,
例如
http://127.0.0.1:8000/?username=xxx
在多个app之间,有可能产生同名的url。这时候为了避免反转url的时候产生混淆,可以使用应用命名空间,来做区分。定义应用命名空间非常简单,只要在app
的urls.py
中定义一个叫做app_name
的变量,来指定这个应用的命名空间即可。这里我们再创建一个app名为’cms’的app,然后再views.py文件中写入:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('CMS首页')
def login(request):
return HttpResponse('CMS登录页面')
然后新建一个urls.py文件,写入代码:
from django.urls import path
from . import views
urlpatterns = [
path('',views.index,name = 'index'),
path('login',views.login,name = 'login'),
]
然后在主urls.py文件中添加进去cms的url:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('front.urls')),
path('cms/',include('cms.urls')),
]
然后我们输入网址http://127.0.0.1:8000
发现跳转至了cms登录页面去了,而我们是想让他跳转至前台登录页面啊!
这是因为我们现在的项目中有两个app,在这两个app中我们都将各自的主页url取名为‘index’,登录页面也都是命名为’login’,在
return redirect( reverse('login') )
进行反转的时候,Django不能准确的找到需要跳转的页面,所以他就会跳转至找到的第一个’login’的页面。这个时候我们就需要让Django明确的知道需要跳转的页面,所以我们在每个app中的urls.py中添加一个变量app_name
app_name = 'front'
app_name = 'cms'
然后我们需要明确的指出需要跳转的页面,在front中的views.py中的index函数修改为
def index(request):
username = request.GET.get('username')
if username:
return HttpResponse('前台首页')
else:
login_url = reverse('front:login')
print(login_url)
return redirect(login_url)
这样Django就明确的知道需要跳转至哪一个页面了。
一个app,可以创建多个实例。即可以使用多个url映射同一个app。所以这就会产生一个问题。以后在做反转的时候,如果使用应用命名空间,那么就会发生混淆。为了避免这个问题。我们可以使用实例命名空间。实例命名空间也是非常简单,只要在include
函数中传递一个namespace
变量即可。
示例:
在主urls.py中对cms添加两个映射,然后实例化命名
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('front.urls')),
path('cms1/',include('cms.urls',namespace='cms1')),
path('cms2/',include('cms.urls',namespace='cms2')),
]
然后我们也修改一下cms的views.py中index函数的代码,没有传入用户名进来时直接跳转至登录页面。
from django.shortcuts import reverse,redirect
def index(request):
username = request.GET.get("username")
if username:
return HttpResponse('CMS首页')
else:
# 获取当前的命名空间
current_namespace = request.resolver_match.namespace
return redirect(reverse("%s:login" % current_namespace))
这样我们就使用cms1进入时,就会进入cms1的登录页面,使用cms2进入,就会进入cms2的登录页面。就不会产生混淆了。