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

url命名为什么需要给url命名?因为url是经常变化的。如果在代码中写死可能会经常改代码。给url取个名字,以后使用url的时候就使用他的名字进行反转就可以了,就不需要写死url了。示例:在项目中新建一个front的app,views.py中写入一下代码:from django.shortcuts import renderfrom django.http import HttpRe... 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django项目一般包含了多个django应用(app). 3.一个视图(view)往往对应多个url地址. 在django实现向解析URL必备条件就是 url和view能一对一 的匹配. (通过view找到唯一一个对应的url,通过url也能找到唯一一个view) 最 简单的方式 就是使用 name ,可以理解为url起了一个名字. from django 1. 路由定义位置 Django的主要路由信息定义在工程同名目录下的urls.py文件,该文件是Django解析路由的入口,也叫总路由. 每个子应用为了保持相对独立,可以在各个子应用定义属于自己的urls.py来保存该应用的路由,也叫子路由。然后用主路由文件包含各应用的子路由数据。 除了上述方式外,也可将工程的全部路由信息都定义在主路由文件,子应用不再设置urls.py。如: from django.conf.urls import url from django.contrib impo 命名空间(namespace):用来表示标识符的作用范围 一个标识符可以在多个命名空间定义,它在不同命名空间的含义是互不相干的。这样,在一个新的命名空间可定义任何标识符,它们不会与任何已有的标识符发生冲突。 应用场景: 当一个项目包含多个app,每个app都有命名相同的标识符时,为了能够使每次访问都能得到想要的结果(访问指定变量),就需要使用namespace。 1、创建... urlpatterns = patterns('', url(r'^archive/(\d{4})/$', archive), url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}), 这是可行的,当对于我上一篇记录的Django之逆向解析url urlpatterns = [ # !!!重要,url命名空间向解析,可用于因路径变更或者名字变更,不需要变路径。 re_path(r'^two/', include(('Two.urls','Two'),namespace='second')), 因django版本问题,可能会报如下错 Specifying a namespace in include() without pr
文章目录1.路由函数:path(),re_path()函数URL换器(convert)2.URL模块化3.URL向视图函数传参向视图函数传参的两种方法URL映射时指定默认参数4.URL命名5.不同条件下URL的跳6.应用命名空间7.实例命名空间8.`include()`函数补充9.`reverse()`函数补充 1.路由函数:path(),re_path()函数 re_path()与pa...
应用命名空间/实例命名空间指定url名称应用命名空间应用命名空间实例命名空间: 因为url经常变化。如果在代码写死可能会经常改代码。给url取个名字,以后使用url的时候就使用他的名字进行就可以了 指定url名称 在path函数,传递一个name参数就可以指定 urlpatterns = [ path('',views.index,name='index'), path('login/',views.login,name='login') 应用命名空间: 在多个app之间,
一、为什么需要url命名? 因为url是经常变化的。如果在代码写死可能会经常改代码。给url取个名字,以后使用url的时候就使用他的名字进行就可以了,就不需要写死url了。 需求:访问app主页,如果没登录则自动跳至登录页面,已经登录则留在app主页。 项目下创建两个app: django-admin startapp app01 djang...