第2天:Django路由与视图
- 在应用中创建视图定义路由
- 配置文件说明
- 静态文件使用
- Django解析路由的流程
- 路由顺序
- 路由命名与reverse反推
在应用中创建视图定义路由
前面我们已经创建了子应用users,但是这个users我们还使用不了,要想使用它,我们必须把它注册到框架应用中。注册子应用非常简单,只需要在配置文件settings.py中的INSTALL_APPS列表中添加该子应用即可,如下:
INSTALLED_APPS = [
...
'users.apps.UsersConfig', #在django老版本(如1.8)可以直接写users,新版本不建议直接写
]
settings.py
注册完成之后,就可以对整个子路由进行开发视图和路由了。
user.views.py用来写视图,如下
from django.shortcuts import render
from django.http import HttpResponse def index(request):
"""
视图
request: 用于接受请求request对象
return: 响应对象
"""
return HttpResponse('hello world')
users.views.py
视图写好了,接下来可以写路由了,可以在users子应用下创建该子应用用于配置路由的文件urls.py
from django.conf.urls import url
from . import views urlpatterns = [
# url(路径,视图)
url(r'^index/$', views.index),
]
users.urls.py
虽然我们子应用配置好了路由,但是我们访问页面路由是去总的路由页面去搜索的,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子路由
]
demo.urls.py
然后我们就可以访问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'
users.apps.py
应用配置:需要在配置文件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.urls.py
视图users.views.py
...
def say(request):
return HttpResponse('say') def sayhello(request):
return HttpResponse('sayhello')
users.views.py
即使访问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')
users.views.py

- 对于未指明namespace的,reverse(路由name)
- 对于指明namespace的,reverse(命名空间namespace:路由name)
第2天:Django路由与视图的更多相关文章
- Django路由与视图
路由层 一.路由匹配规则: 第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即匹配,直接执行对应的视图函数 url(r'login', views.login), 如果按上面的形 ...
- FROM DELETE LIBRARY TO RUN の Django路由和视图
一.requests安装 · requests是什么? request是python实现的简单易使用的http库 · 如何安装? pip install requests ·检测是否成功 import ...
- Django基础(路由、视图、模板)
目录导航 Django 路由控制 Django 视图层 Django 模版层 Django 路由控制 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用 ...
- Django的View(视图)和路由系统
一.Django的View(视图) 1.介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一 ...
- Django Rest Framework 视图和路由
Django Rest Framework 视图和路由 DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们 ...
- 【python】-- Django路由系统(网址关系映射)、视图、模板
Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...
- day53_9_17 django数据库表关联,路由和视图
一.数据库的关系建立. 在原生的数据库语句中,建立表与表之间的联系,就是添加一个字段,将联系的表的id值添加到该字段中. django所作的也就是这些. 以图书管理系统为例,图书管理系统有四张表:书籍 ...
- Django drf:视图层封装、ViewSetMixin、路由配置、解析器、响应器
一.视图层封装 二.ViewSetMixin 三.路由配置 四.解析器 五.响应器 一.视图层封装 1.基本视图 写一个出版社的增删改查resfull接口 路由: url(r'^publish/$', ...
- Django基础三之路由、视图、模板
Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...
随机推荐
- Druid.io通过NiFi摄取流数据
NiFi是一个易于使用,功能强大且可靠的系统来处理和分发数据. 本文讲述如何用NiFi将Http的Json数据传到Druid.国外的一篇文章讲到如何用NiFi将推文传到Druid,https://co ...
- [洛谷P1228]地毯填补问题 题解(分治)
Description 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的 ...
- HDU 4548 美素数 在线打表加数状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4548 解题报告:一开始本想先打个素数表,然后每次输入L 跟R 的时候都进行暴力判断,但这题测试数据太多 ...
- 【leetcode 简单】 第八十九题 赎金信
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成.如果可以构成,返回 true :否则返回 ...
- 通过Class类获取对象实例
通过Class对象获取对象的方式是通过class.newInstance()方式获取,通过调用默认构造参数实例化一个对象. /** * Created by hunt on 2017/6/27. * ...
- celery简介
目录 Celery简介 Celery架构 中间件选择 Celery序列化 简单项目 Celery简介 celery userguide 知乎大神解释celery Celery(芹菜)是基于Python ...
- 17、enum简介
enum简介 在日常开发中可能有一些东西是固定的,比如一年只有4个季节,春夏秋冬.我们可以自己定义一个类里面存放这4个季节.在jdk5之后,引入了枚举(enum)的概念,可以通过enum去定义这四个季 ...
- Mysql 关闭自动commit
更多内容推荐微信公众号,欢迎关注: 1. 会话级关闭自动提交 mysql> set autocommit=off; Query OK, 0 rows affected (0.00 sec) my ...
- Struts2笔记1:--Struts2原理、优点、编程流程、6大配置文件以及核心配置文件struts.xml
Struts2原理(底层使用的是Servlet的doFilter方法): Struts2优点: 第一个Struts程序: 在开发Struts程序之前,首先要导入额外的jar包,基本需求的是14个jar ...
- C#基础之静态和非静态的区别
1.在非静态即可有非静态成员又可以有静态成员 2非静态调用创建类的对象.方法名,静态成员直接引用对象名