dy02项目配置和路由
1项目的配置
1.1配置文件
1.BASE_DIR为当前工程的根目录
BASE_DIR = Path(__file__).resolve().parent.parent
# 意思是项目根目录为文件所在路径的父级目录的父级目录
Django会依此来定位工程内的相关文件,我们也可以使用该参数来构造文件路径
2. DEBUG
调试模式,创建工程后初始值为True,即默认工作在调试模式下。
作用:
修改代码文件,程序自动重启
Django程序出现异常时,向前端显示详细的错误追踪信息
而非调试模式下,仅返回Server Error (500)
注意:部署线上运行的Django不要运行在调式模式下,记得修改DEBUG=False
1.2本地语言与时区
Django支持本地化处理,即显示语言与时区支持本地化。
本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国化,中国大陆地区使用简
体中文,时区使用亚洲/上海时区,注意这里不使用北京时区表示。
初始化的工程默认语言和时区为英语和UTC标准时区
将语言和时区修改为中国大陆信息
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
# USE_TZ = True
2.静态文件
项目中的CSS、图片、js都是静态文件。一般会将静态文件放到一个单独的目录中,以方便管理。在
html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路
径。静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用
的,所以推荐放在项目的根目录下,方便管理。
为了提供静态文件,需要配置两个参数:
STATICFILES_DIRS 存放查找静态文件的目录
STATIC_URL 访问静态文件的URL前缀
在setting.py中修改静态文件的两个参数为
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / 'static'
]
例如,我们向static目录中添加一个index.html文件,在浏览器中就可以使用
127.0.0.1:8000/static/index.html来访问。
注意
Django 仅在调试模式下(DEBUG=True)能对外提供静态文件。
当DEBUG=False工作在生产模式时,Django不再对外提供静态文件,需要是用collectstatic命令来收集
静态文件并交由其他静态文件服务器来提供。(详细在部署时会讲)
3.路由说明
3.1路由定义位置
URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应。
Django奉行DRY主义,提倡使用简洁、优雅的URL,没有.php或.cgi这种后缀,更不会单独使用0、2097、1-1-1928、00这样无意义的东西。
一、概述
URL路由在Django项目中的体现就是urls.py文件,这个文件可以有很多个,但绝对不会在同一目录下。实际上Django提倡项目有个根urls.py,各app下分别有自己的一个urls.py,既集中又分治,是一种解耦的模式。
Django的主要路由信息定义在工程同名目录下的urls.py文件中,该文件是Django解析路由的入口。
每个子应用为了保持相对独立,可以在各个子应用中定义属于自己的urls.py来保存该应用的路由。
然后用主路由文件包含各应用的子路由数据。
URLconf不检查使用何种HTTP请求方法,所有请求方法POST、GET、HEAD等都将路由到同一个URL的同一个视图。在视图中,才根据具体请求方法的不同,进行不同的处理。
3.2路由解析顺序
Django在接收到一个请求时,
从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路由规
则,
如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下进行查询。
值得关注的由上至下的顺序,有可能会使上面的路由屏蔽掉下面的路由,带来非预期结果。
例如:
app_name = 'books'
urlpatterns = [
path('index/',views.index,name='index'),
path('index00',views.ind),
]
即使访问index00路径,预期应该进入ind视图执行,但实际优先查找到了indexy路由规则也与
index00/路径匹配,实际进入了index视图执行。
3.3路由命名与resverse反解析
在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。
1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如
命名空间表示
path('books/', include('books.urls',namespace='books')),
凡是books.urls中定义的路由,均属于namespace指明的books名下。
命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。
2在定义普通路由时,可以使用name参数指明路由的名字,
如 reverse反解析
使用reverse函数,可以根据路由名称,返回具体的路径,如:
from django.urls import reverse # 注意导包路径
def index(request):
return HttpResponse("hello the world!")
def say(request):
url = reverse('books:index') # 返回 /books/index/
print(url)
return HttpResponse('say')
对于未指明namespace的,reverse(路由name)
对于指明namespace的,reverse(命名空间namespace:路由name)
-
路径结尾斜线/的说明
Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时,Django会
把用户重定向到以斜线/结尾的路径上,而不会返回404不存在。如
用户访问 index 或者 index/ 网址,均能访问到index视图。
说明:
re_path(r'^users/', include('users.urls', namespace='users')),
虽然路由结尾带/能带来上述好处,但是却违背了HTTP中URL表示资源位置路径的设计理念。
是否结尾带/以所属公司定义风格为准。
from django.shortcuts import render,reverse,redirect
# 重定向的使用
def index2(request):
# return redirect('index')
return redirect(reverse('index'))
# return HttpResponse('index2')
Django如何处理请求
Django如何处理请求
当用户请求一个页面时,Django根据下面的逻辑执行操作:
决定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但是如果传入的HttpRequest对象具有urlconf属性(由中间件设置),则其值将被用于代替ROOT_URLCONF设置。也就是说你可以自定义项目入口url是哪个文件!
加载该模块并寻找可用的urlpatterns。 它是django.urls.path()或者django.urls.re_path()实例的一个列表。
依次匹配每个URL模式,在与请求的URL相匹配的第一个模式停下来。也就是说,url匹配是从上往下的短路操作,所以url在列表中的位置非常关键。
导入并调用匹配行中给定的视图,该视图是一个简单的Python函数(被称为视图函数),或基于类的视图。 视图将获得如下参数:
一个HttpRequest 实例。
如果匹配的表达式返回了未命名的组,那么匹配的内容将作为位置参数提供给视图。
关键字参数由表达式匹配的命名组组成,但是可以被django.urls.path()的可选参数kwargs覆盖。
如果没有匹配到任何表达式,或者过程中抛出异常,将调用一个适当的错误处理视图。(比如403,比如无任何反应)