# DEBUG模式:
- 开启debug模式后,修改项目代码时按下ctrl+s可重启项目;
- 项目中出现bug时,浏览器与控制台会打印错误信息;
- 在生产环境中禁止开启DEBUG模式,有很大的安全隐患;
- 将DEBUG设置为False时,必须设置ALLOWED_HOSTS。
-
- ALLOWED_HOSTS :用来设置以后只能通过这个变量中的IP或域名来进行访问
# 视图函数:
- 第一个参数必须是 request ; book_id 后可添加默认参数。
- 返回值必须是 ‘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模块化:
- 每个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文件
- ‘App’的 urls.py 中,所有的url匹配也要放在变量 urlpatterns 中,否则找不到;
1 #App的urls.py 2 ''' 3 urlpatterns = [ 4 path('/detail/<book_id>/',views.book_detail) 5 ] 6 '''
- 项目的‘url’会根据 urls.py 和App中的 urls.py 进行拼接,注意不能多加斜杆。(得到的URL为:http://.../book/detail/1)
# url命名:
- 为App的‘ url ’命名,防止后期‘url’经常变动。后期反转时使用 name 定义的url名字。前面显示的 login 可变动;
1 #app的urls.py 2 ''' 3 path('login/',views.login,name='login') 4 '''
- 存在多个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)命名空间与实例命名空间:
- 一个App可使用多个URL实例进行映射,所以使用命名空间时容易发生混淆;使用 实例命名空间‘namespace’ 来解决该问题
1 #项目urls.py 2 ''' 3 path('login1/',include('front.urls',namespace='login1')) 4 path('login2/',include('front.urls',namespace='login2')) 5 '''
- 反转时使用实例命名空间指定具体的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()函数:
- include(module,namespace=None)
- module:子 url 的模块字符串;
- namespace:指定实例命名空间时必须先指定应用命名空间app_name;
- include((pattern_list,app_namespace),namespace=None)
- 函数的第一个参数可以为一个字符串或者一个元组,为元组时第一个参数为App的 url.py 模块的字符串,第二个参数为应用命名空间;
1 ''' 2 path(('login/',include('front.urls','login'),namespace='book')) 3 '''
- 函数的第一个参数可以为一个字符串或者一个元组,为元组时第一个参数为App的 url.py 模块的字符串,第二个参数为应用命名空间;
- 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:
- 作用比 ‘path’ 强大,写 url 时可使用正则表达式;(无特殊情况时建议使用:path)
- 写正则表达式时使用原生字符串,即以 ‘r’ 开头的字符串;
- 正则表达式使用圆括号定义变量,参数有名字时使用 ?P<参数名字> ,然后在后面添加正则表达式的规则。
1 ''' 2 re_path(r"^list/(?P<year>d{4}/$",views.book_list) 3 '''
# reverse函数:
- 在反转 ur l时,如需添加参数,可传递 kwargs 参数到reverse函数中
1 #应用urls.py 2 ''' 3 return redirect(reverse('book',kwargs={'book_id':1,'page':2})) 4 '''
- 如需添加字符串的参数,则必须手动进行拼接
1 #在没输入关键参数时自动跳转到登录页面,next告诉下一步跳转的位置 2 ''' 3 return redirect(reverse('login') + "?next=/") 4 ''' 5 #类似于知乎的首页登录跳转 6 #知乎网站:https://www.zhihu.com/signup?next=%2F (%2F = /) 7 #进入时自动跳转到 signup 的url登录页面,后面告知下一步跳转到首页