第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. ...
随机推荐
- [php]mysql操作流程
这种是比较老的一种mysql连接方法 1.连接数据库 $this->con = mysql_connect($this->host, $this->user, $this->p ...
- codeforces997C Sky full of stars
传送门:http://codeforces.com/problemset/problem/997/C [题解] 注意在把$i=0$或$j=0$分开考虑的时候,3上面的指数应该是$n(n-j)+j$ 至 ...
- 微信小程序开发(五)开发框架MINA
微信团队为小程序提供的框架命名为MINA应用框架.MINA框架通过封装微信客户端提供的文件系统.网络通信.任务管理.数据安全等基础功能,对上层提供一整套JavaScript API,让开发者能够非常方 ...
- [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)
[NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...
- 天梯赛 L2-007. (并查集) 家庭房产
题目链接 题目描述 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式 ...
- aarch64_g1
GAPDoc-1.5.1-12.fc26.noarch.rpm 2017-02-14 07:37 1.0M fedora Mirroring Project GAPDoc-latex-1.5.1-12 ...
- MySQL修改datadir目录
更改MySQL的数据目录由/usr/local/mysql/data/更换至/data/mysql/ 第一种方法修改my.cnf 1)关闭MySQL [root@test2 ~]# service m ...
- ArcGIS RunTime Sdk +WPF 基础地图显示
1 简单的地图展示 ArcGISRunTime 的平面地图展示主要依赖MapView这个控件,MapView是地图的容器,Map主要是图层的集合 (注:三维场景的显示主要依赖SceneView这个控件 ...
- npm 下载node-zookeeper包
环境:centos7(lunix) 1.安装nvm curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install. ...
- IIS 启用https
参考:http://www.cnblogs.com/dudu/p/iis_https_ca.html