zoukankan      html  css  js  c++  java
  • 三、Django的urls

    Django的urls相关

    一、url配置

    无名分组

    urls.py:

    url(r'^books/(d{4})/', views.books),
    

    views.py:

    def books(request,year): # 必须给一个参数
        print(year)
        return HttpResponse(year)
    

    比如用户输入网址:127.0.0.1:8000/books/2000,则返回页面打印的就是2000;

    输入127.0.0.1:8000/books/2018,则返回页面打印的就是2018;

    效果:

    位置参数(按顺序传参)

    urls:

    url(r'^books/(d{4})/', views.year_books), #匹配年份的
    	http://127.0.0.1:8000/books/2001/
    url(r'^books/(d{4})/(d{1,2})/', views.year_month_books), #匹配年份和月份的
    	http://127.0.0.1:8000/books/2001/12/
    

    视图 views文件:

    def year_month_books(request,year,month): #位置参数,第一个参数接收的就是无名分组路径中匹配到的第一个分组的数据,第二个参数接收的就是无名分组路径中匹配到的第二个分组的数据
    	print(year,month)
    	# return render(request,'books.html')
    	return HttpResponse(year+month)
    

    假如有这样一个需求:用户输入127.0.0.1:8000/books/2001,则只匹配年份2001;输入127.0.0.1:8000/books/2001/12,则匹配年份和月份

    urls.py:

    urlpatterns = [
        url(r'^books/(d{4})/$', views.year_books), # 在末尾加$,严格匹配,否则无论用户只输入了年份,还是输年份和月份,都只匹配这个,显示年份
        url(r'^books/(d{4})/(d{1,2})/', views.year_month_books)
    

    views.py:

    def year_books(request,year):
        print(year)
        return HttpResponse(year)
    
    def year_month_books(request,year,month):
        print(year)
        print(month)
        return HttpResponse(year+month)
    

    注意事项:

    1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
    2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
    3. 不需要添加一个前导的反斜杠(也就是写在正则最前面的那个/),因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
    4. 每个正则表达式前面的'r' 是可选的,表示转义,但是建议加上。
    5. ^articles$ 以什么结尾,以什么开头,严格限制路径

    补充:

    # 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
    # 写在settings文件里
    APPEND_SLASH=True  
    # 默认是True,比如输入127.0.0.1:8000/books/2001,2001后面没有加/,会返回一个3xx的状态码,然后给2001后面拼一个/,然后再去请求;
    
    APPEND_SLASH=False 
    # 设置了False,此时再输入127.0.0.1:8000/books/2001就访问不到了,必须在2001后面加/才可以访问
    

    有名分组

    urls:

    url(r'^books/(?P<year>d{4})/(?P<month>d{1,2})/', views.year_month_books),
    

    views:

    def year_month_books(request,month,year): #形参名称要和url中的分组名对应好,参数位置就没有要求了
    	print(year,month)
    	return HttpResponse(year+month)
    

    默认值

    # urls.py中
    from django.conf.urls import url
    from . import views
    urlpatterns = [
    	url(r'^blog/$', views.page),
    	url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
    ]
    
    
    # views.py中,可以为num指定默认值
    def page(request, num="1"):
    	pass
    

    比如:

    urls:

    urlpatterns = [
        url(r'^books/$', views.books),
        url(r'^books/(?P<num>d{4})/',views.books),
    ]
    

    views:

    def books(request,num='10'):
        print(num)
        return HttpResponse(num)
    

    效果:

    当输入网址127.0.0.1:8000/books/,走默认值,页面显示默认值10:

    当输入网址127.0.0.1:8000/books/2002/,被下面的正则匹配到,显示后面的数,比如2002:

    二、url路由分发——include

    views和models文件都放在了app的应用里面,而urls.py这个文件放在了项目的文件里,说明所有的app都在使用这个urls.py文件,当项目的应用有很多个,那urls文件里面要写很多的对应关系,所有的app的url都写在这一个文件中,耦合度太高,多以Django提供了一个分发接口——include
    
    也就是在每个app应用文件里都写一个属于自己的urls.py文件,然后在项目文件的urls.py文件用include分发借口
    

    例子:

    因为pycharm新建时,只能建立一个应用app01,再建立一个应用app02方法:

    1. 先在settings配置文件配置下app02(app01在建立项目时候自动配置了)
      INSTALLED_APPS = [
      ......
      'app01.apps.App01Config',
      'app02.apps.App02Config',
      ]

    2. 应用 app01 下建立urls.py文件,写本应用对应的路径关系
      from django.conf.urls import url
      from app01 import views

      urlpatterns = [
          url(r'^index/', views.index),
      ]
      

      应用 app01 下的视图 views.py
      from django.shortcuts import render,HttpResponse
      # Create your views here.

      def index(request):
          return HttpResponse('应用界面01')
      
    3. 应用 app02 下建立urls.py文件
      from django.conf.urls import url
      from app02 import views

      urlpatterns = [
          url(r'^home/',views.home ),
      ]
      

      应用 app02 下的视图 views.py
      from django.shortcuts import render,HttpResponse
      # Create your views here.

      def home(request):
          return HttpResponse('应用界面02')
      
    4. 主项目中的urls,要用 include 分发接口
      from django.conf.urls import url,include # 记得要导入include
      from django.contrib import admin

      urlpatterns = [
      
          url(r'^app01/', include('app01.urls')),
          # 相当于:http://127.0.0.1:8000/app01/asdsfdfeas....
          
          url(r'^app02/', include('app02.urls')),
          # 相当于:http://127.0.0.1:8000/app02/.....
      ]
      
      # 注意点:想用include分发路径,千万不要用到 $ ,否则无法匹配.比如:url(r'^app01/$', include('app01.urls'))
      
    5. 此时在网址输入 127.0.0.1:8000/app01/index/,先走主项目的urls,匹配到127.0.0.1:8000/app01/,把剩余的路径 index/ 通过include的功能传给app01里面的urls,匹配index/,得到结果

      同理,输入 127.0.0.1:8000/app02/home/,也能拿到对应的结果

      在此基础上,有这样一个需求:给整个项目做一个首页,每个应用也都做一个首页

    6. 再建立一个应用app03,专门做整个项目的首页
      主项目的urls:
      from django.conf.urls import url,include
      from app03 import views

      urlpatterns = [
      
          url(r'^$', views.base), # 匹配空内容,就是输入ip和端口后什么也没输入
          # 注意:别忘记写^$
      
          url(r'^app01/', include('app01.urls')),
          # http://127.0.0.1:8000/app01/asdsfdfeas....
          url(r'^app02/', include('app02.urls')),
          # http://127.0.0.1:8000/app02/.....
      ]
      

      app03 下的 views:
      from django.shortcuts import render

      def base(request):
          return render(request,'base.html')
      

      base.html 放在 模板 templates 文件夹中

      欢迎来到首页

    7. 制作app01的首页:
      app01 下的urls:
      from django.conf.urls import url
      from app01 import views

      urlpatterns = [
          url(r'^$',views.firstbase ),
          url(r'^index/', views.index),
      ]
      

      app01 下的views:
      from django.shortcuts import render,HttpResponse

      def index(request):
          return HttpResponse('应用界面01')
      
      def firstbase(request):
          return render(request,'app01base.html')
      

      app01base.html 放在 模板 templates 文件夹中

      应用1的首页

    8. 制作app02的首页:
      app02 下的urls:
      from django.conf.urls import url
      from app02 import views

      urlpatterns = [
          url(r'^$',views.secondbase ),
          url(r'^home/',views.home ),
      ]
      

      app02 下的views:
      from django.shortcuts import render,HttpResponse

      def home(request):
          return HttpResponse('应用界面02')
      
      def secondbase(request):
          return render(request,'app02base.html')
      

      app02base.html 放在 模板 templates 文件夹中

      应用2的首页

      1. 效果:
        输入127.0.0.1:8000,就是项目的首页;
        127.0.0.1:8000/app01/ ,就是应用1的首页;
        127.0.0.1:8000/app02/ ,就是应用2的首页;
        127.0.0.1:8000/app01/index 或者127.0.0.1:8000/app02/home还照样能拿到对应的内容

    三、简单

    1. url配置

      urls.py文件中写在urlpatterns = []中
      简单的路由
      from app01 import views
      url(r'^index/',views.index),
      无名分组
      url(r'^index/(d+)/(d+)/',views.index), --- def index(request,n,m) 位置参数
      有名分组
      url(r'^index/(?Pd+)/(?Pd+)/',views.index), -- def index(request,year,month) 关键字参数,参数顺序不要求

      url(r'^index/$',views.index),
      url(r'^index/(?Pd+)/,views.index),
      视图函数参数默认值,
      def index(request,num='1'):
      print(num)

    2. 路由分发

      from django.conf.urls import url,include
      url(r'app01/',include('app01.urls')),

  • 相关阅读:
    Linux-解决putty无法直接使用root用户远程登录linux主机的问题
    Linux-安装jdk
    Linux-安装谷歌浏览器
    Linux-安装ssh服务
    java正则表达式匹配文本中想要的字符串
    日常技术资源收集
    《java编程思想》:散列的原理
    《java编程思想》:字符串
    win10完美去除快捷方式小箭头
    WS_2012
  • 原文地址:https://www.cnblogs.com/yangzm/p/11209884.html
Copyright © 2011-2022 走看看