配置,静态文件和路由说明
配置文件
BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
这个获取到的路径是跟manage.py同级
本地语言和时区
LANGUAGE_CODE = 'en-us' # 语言 TIME_ZONE = 'UTC' # 时区
将语言和时区修改为中国大陆信息
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
静态文件
为了提供静态文件,需要配置两个参数:
- STATICFILES_DIRS 存放查找静态文件的目录
- STATIC_URL 访问静态文件的URL前缀
例如
在manage同级下面创建一个文件夹static_files
在配置文件settings.py中修改配置信息如下
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static_files'), ]
例如我们在static_files 新建一个index.html文件
我们就可以在浏览器中127.0.0.1:8000/static/index.html来访问。
或者我们在static_files目录中添加了一个子目录和文件goods/detail.html,在浏览器中就可以使用127.0.0.1:8000/static/goods/detail.html来访问。
路由
1.路由顺序解析
django在接收到一个请求的时候,从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下进行查询。
值得关注的由上至下的顺序,有可能会使上面的路由屏蔽掉下面的路由,带来非预期结果。例如:
urlpatterns = [ url(r'^say', views.say), url(r'^sayhello', views.sayhello), ]
即使访问sayhello/路径,预期应该进入sayhello视图执行,但实际优先查找到了say路由规则也与sayhello/路径匹配,实际进入了say视图执行。
解决办法
在路由后面加个/$,如下
urlpatterns = [ url(r'^say/$', views.say), url(r'^sayhello/$', views.sayhello), ]
2.路由命名和reverse反解析(逆向)
2.1 路由命名(命名空间, namespace, name)
在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。
1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如
在drf_django/urls路由下
url(r'^users/$', include('users.urls', namespace='users')),
意思就是凡是users.urls中定义的路由,反向解析全部指定到users下
作用是避免使用了相同的url名字,发生冲突,使用命名空间区别开
2) 定义普通路由时,可以使用name参数指明路由的名字,如
urlpatterns = [ url(r'^index/$', views.index, name='index'), url(r'^say/$', views.say, name='say'), ]
name没有作用域,在反解URL时,进行全局顺序搜索查找到第一个name指定URL时立即返回,我们在开发项目时,会经常使用name属性反解出URL,当不小心定义相同的name时,可能会导致URL反解错误,这时就引入了命名空间
总结:当在普通路由下指定了name,我们在反解析路由地址的时候,比如有多个app,每个app下name都指定了index,这时就引入了命名空间 也就是namespace,来进行区分,为下面反解析铺垫。
2.2 reverse(反解析)
使用reverse函数,可以根据路由来返回具体的路径。
from django.urls import reverse def index(request): """ index视图 :param request:包含了请求信息的请求对象 :return:响应对象 """ return HttpResponse('hello the word!!') def say(request): url = reverse('users:index') # /users/index/ print(url) return HttpResponse('say')
总结:
- 对于未指明namespace的,reverse(路由name)
- 对于指明namespace的,reverse(命名空间namespace:路由name)
3 路径结尾/的说明
urlpatterns = [ url(r'^index/$', views.index, name='index'), ]
定义URL的时候我们通常以/$结尾,用户访问的时候不加/,Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在
总结:
用户访问 index 或者 index/ 网址,均能访问到index视图。