URL简单梳理

# DEBUG模式

  1. 开启debug模式后,修改项目代码时按下ctrl+s可重启项目;
  2. 项目中出现bug时,浏览器与控制台会打印错误信息;
  3. 在生产环境中禁止开启DEBUG模式,有很大的安全隐患;
  4. 将DEBUG设置为False时,必须设置ALLOWED_HOSTS
    •  ALLOWED_HOSTS :用来设置以后只能通过这个变量中的IP或域名来进行访问

 

视图函数

  1. 第一个参数必须是 request ; book_id 后可添加默认参数。
  2. 返回值必须是 ‘django.http.response.HttpResponse’ 的子类对象
     1 #(app)front中views.py
     2 from django.http import HttpResponse
     3 
     4 def index(request):
     5     return HttpResponse('网站首页')
     6 
     7 def books(requeset,book_id):
     8     text = '图书的ID是:%s' % book_id
     9     return HttpResponse(text)
    10 
    11 #项目urls.py
    12 from django.urls import path
    13 from front import views
    14 
    15 urlpatterns = [
    16     #http://127.0.0.1:8000/
    17     path('',views.index),
    18     #http://127.0.0.1:8000/book/1
    19     path('book/<book_id>/',views.books)
    20 ]

     

urls模块化

  1. 每个App的 urls 都放到自己的App进行管理,在App中新建一个 urls.py 文件来存储所有和这个App相关的 子url ,然后在项目的主 urls.py 文件下使用 include 来包含各个App的 urls.py 文件,如:
    1 #项目urls.py
    2 '''
    3 urlpatterns = [
    4     path('book/',include('book.urls'))
    5 ]
    6 '''  #book.urls为应用程序book的urls.py文件

     

  2. ‘App’的 urls.py 中,所有的url匹配也要放在变量 urlpatterns 中,否则找不到;
    1 #App的urls.py
    2 '''
    3 urlpatterns = [
    4     path('/detail/<book_id>/',views.book_detail)
    5 ]
    6 '''

     

  3. 项目的‘url’会根据 urls.py 和App中的 urls.py 进行拼接,注意不能多加斜杆。(得到的URL为:http://.../book/detail/1)

 

url命名

  1. 为App的‘ url ’命名,防止后期‘url’经常变动。后期反转时使用 name 定义的url名字。前面显示的 login 可变动;
    1  #app的urls.py
    2 '''
    3 path('login/',views.login,name='login')
    4 '''

     

  2. 存在多个App时,为防止同名的‘url’产生混淆,使用 ‘命名空间 ’app_name 来进行区分;
    1 #App的urls.py文件
    2 '''
    3 app_name = 'front’  #app的名称
    4 
    5 urlpatterns = [
    6     path('login/',views.login,name='login')
    7 ]
    8 '''

     

    反转时使用 命名空间:url名称 进行反转

    1 app的urls.py文件
    2 '''
    3 return redirect(reverse(‘front:login’))   #反转到front应用程序的url页面(name=‘login’的值)。
    4 '''

     

# 应用(app)命名空间与实例命名空间:

  1. 一个App可使用多个URL实例进行映射,所以使用命名空间时容易发生混淆;使用 实例命名空间‘namespace’ 来解决该问题
    1 #项目urls.py
    2 '''
    3     path('login1/',include('front.urls',namespace='login1'))
    4     path('login2/',include('front.urls',namespace='login2'))
    5 '''

     

  2. 反转时使用实例命名空间指定具体的url;
     1 #应用程序urls.py
     2 '''
     3 def idnex(request):
     4     username = request.GET.get('username')
     5     if username:
     6         return HttpResponse('front首页')
     7     else:
     8         #获取当前命名空间
     9         current_namespace = request.resolver_match.namespace
    10         return redirect(reverse('%s:login' % current_namespace))
    11 '''

     

# include()函数:

  1. include(module,namespace=None)
    • module:子 url 的模块字符串;
    • namespace:指定实例命名空间时必须先指定应用命名空间app_name;

       

  2. include((pattern_list,app_namespace),namespace=None)
    • 函数的第一个参数可以为一个字符串或者一个元组,为元组时第一个参数为App的 url.py 模块的字符串,第二个参数为应用命名空间;
      1 ''' 
      2 path(('login/',include('front.urls','login'),namespace='book'))
      3 '''

       

  3.  include(pattern_list) :列表中装 path 或 re_path 。
    1 '''
    2 path('movies/',include([
    3     path(' ',views.movie),
    4     path('list/',views.movie_list),
    5 ]))
    6 '''

     

# re_path

  1. 作用比 ‘path’ 强大,写 url 时可使用正则表达式;(无特殊情况时建议使用:path)
  2. 写正则表达式时使用原生字符串,即以 ‘r’ 开头的字符串;
  3. 正则表达式使用圆括号定义变量,参数有名字时使用 ?P<参数名字> ,然后在后面添加正则表达式的规则。
    1 '''
    2 re_path(r"^list/(?P<year>\d{4}/$",views.book_list)
    3 '''

     

# reverse函数

  1. 在反转 ur l时,如需添加参数,可传递 kwargs 参数到reverse函数中
    1 #应用urls.py
    2 '''
    3 return redirect(reverse('book',kwargs={'book_id':1,'page':2}))
    4 '''

     

  2. 如需添加字符串的参数,则必须手动进行拼接
    1 #在没输入关键参数时自动跳转到登录页面,next告诉下一步跳转的位置
    2 '''
    3 return redirect(reverse('login') + "?next=/")
    4 '''
    5 #类似于知乎的首页登录跳转
    6 #知乎网站:https://www.zhihu.com/signup?next=%2F    (%2F = /)
    7 #进入时自动跳转到 signup 的url登录页面,后面告知下一步跳转到首页

     

     

posted @ 2019-01-18 22:50  F·灬小人物  阅读(313)  评论(0编辑  收藏  举报