- 在应用中创建视图定义路由
- 配置文件说明
- 静态文件使用
- Django解析路由的流程
- 路由顺序
- 路由命名与reverse反推
在应用中创建视图定义路由
前面我们已经创建了子应用users,但是这个users我们还使用不了,要想使用它,我们必须把它注册到框架应用中。注册子应用非常简单,只需要在配置文件settings.py中的INSTALL_APPS列表中添加该子应用即可,如下:
INSTALLED_APPS = [ ... 'users.apps.UsersConfig', #在django老版本(如1.8)可以直接写users,新版本不建议直接写 ]
注册完成之后,就可以对整个子路由进行开发视图和路由了。
user.views.py用来写视图,如下
from django.shortcuts import render from django.http import HttpResponse def index(request): """ 视图 request: 用于接受请求request对象 return: 响应对象 """ return HttpResponse('hello world')
视图写好了,接下来可以写路由了,可以在users子应用下创建该子应用用于配置路由的文件urls.py
from django.conf.urls import url from . import views urlpatterns = [ # url(路径,视图) url(r'^index/$', views.index), ]
虽然我们子应用配置好了路由,但是我们访问页面路由是去总的路由页面去搜索的,urls.py,因此我们需要在总的路由文件urls.py把子应用路由users.urls包含进来
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', include('users.urls')), #包含users子路由 ]
然后我们就可以访问http://127.0.0.1:8000/users/index
配置文件说明
在项目的settings.py配置文件中,进行项目相关配置的解释修改
BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前项目的根目录,Django会以此来定位工程内的相关文件,我们也可以使用参数来构建文件路径
DEBUG
DEBUG = True #是否为开发模式,默认为True
当DEBUG为True时,如果Django程序运行出现异常时,会在浏览器显示详细的出错调试信息,在非开发模式下,不会显示出错调试信息
注意:项目上线应该设置为False关闭开发模式,并且要同时设置ALLOWED_HOSTS参数
# 关闭开发模式 DEBUG = False #设置允许哪些主机访问,*表示匹配所有(ip) ALLOWED_HOSTS = ['*']
App应用配置
在每个应用的目录中都包含了apps.py,用于保存该应用的相关信息,在创建应用时,Django会向apps.py文件中写入一个该应用的配置类,如下:
from django.apps import AppConfig class UsersConfig(AppConfig): # 表示这个配置类是加载到哪个应用 # 每个配置类必须包含次属性,默认自动生成 name = 'users'
应用配置:需要在配置文件settings.py中的INSTALLED_APPS列表中,注册创建出来的应用
INSTALLED_APPS = [ ... 'users.apps.UsersConfig', ]
本地语言与时区
Django支持本地化处理,即显示语言与时区,新创建的Django项目,默认使用的语言为英语,时区为UTC标准时区,我们可以将语言和时区修改为中国大陆信息
LANGUAGE_CODE = 'zh-hans' #语言设置为 中文 TIME_ZONE = 'Asia/Shanghai' #时区设置为 亚洲/上海
静态文件使用
在项目中css、js、img都是静态文件,静态文件可以放在一个单独的目录中,以方便管理。我们配置静态文件相关配置需要确定一下两点:
- STATICFILES_DIRS 静态文件保存在哪个目录下(此参数默认django没有配置,需要开发者自己配置)
- STATIC_URL 访问静态文件的URL前缀,通常采用默认自/static/
在项目根目录下创建static_files目录,并添加子目录和文件 imgs/heboan.jpg
在项目settings.py文件中进行配置
# 访问静态文件用到的url前缀 STATIC_URL = '/static/' #告知Django静态文件保存在哪个目录下 STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_files')]
浏览器访问http://127.0.0.1:8000/static/imgs/heboan.jpg
因此,我们可以在index.html模板中应用
<img src="/static/imgs/heboan.jpg" />
Django仅在开发模式下能对外提供静态文件
当DEBUG=False工作在生产模式时,Django不再对外提供静态文件,需要用collectstaic命令来收集静态文件并交由其他静态文件服务器来提供
Django解析路由的流程
路由顺序
Django在接收到一个请求时,从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应的路由规则,如果发现规则为include包含,则再进入urls中的urlpassterns列表由上至下进行查询。
值得关注的由上至下的顺序,有可能会使上面的路由屏蔽掉下面的路由,带来非预期的结果,如下,
路由users.urls.py
from django.conf.urls import url from . import views urlpatterns = [ # url(路径,视图) url(r'^index/$', views.index), url(r'^say', views.say), url(r'^sayhello', views.sayhello) ]
视图users.views.py
... def say(request): return HttpResponse('say') def sayhello(request): return HttpResponse('sayhello')
即使访问sayhello路径,预期应该进入sayhello视图执行,但实际悠闲查找到say路由规则也与sayhello/路径匹配,实际进入了say视图执行。
路由命名与reverse反推
路由命名
在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息
1)在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如demo.urls.py(总路由文件)
urlpatterns = [ ... url(r'^users/', include('users.urls', namespace='users')), ]
2)在定义普通路由时,可以使用name参数指名路由的名字,如users.urls.py
urlpatterns = [ # url(路径,视图) url(r'^index/$', views.index, name='index'), url(r'^say', views.say, name='say'), ]
reverse反解析
使用reverse函数,可以根据路由名称,返回具体的路径,如下
from django.shortcuts import render from django.http import HttpResponse from django.core.urlresolvers import reverse ... def say(request): url = reverse('users:index') print(url) return HttpResponse('say')
- 对于未指明namespace的,reverse(路由name)
- 对于指明namespace的,reverse(命名空间namespace:路由name)