Django中url命名与反转url,应用命名空间和实例命名空间

url命名

为什么需要给url命名?

因为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)命名空间

在多个app之间,有可能产生同名的url。这时候为了避免反转url的时候产生混淆,可以使用应用命名空间,来做区分。定义应用命名空间非常简单,只要在appurls.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

front中的urls.py中添加:

app_name = 'front'

cms中的urls.py中添加:

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的登录页面。就不会产生混淆了。

你可能感兴趣的:(django)