第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. ...
随机推荐
- 推荐一款超级漂亮的HTML5 CSS3的图片轮播器
最近在学习HTML5和CSS3,印象最深的是CSS3的动画功能,不仅有浏览器原生支持,执行效率高,而且免去在js中自己管理timer. 本来想写一个图片轮播器练练手,结果在网上发现一个国人写的开源的图 ...
- 20155213 2016-2017-2 《Java程序设计》第五周学习总结
20155213 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生时显示友好的错误信 ...
- 基本控件文档-UIScrollView
CHENYILONG 基本控件文档-UIScrollView Fullscreen 基本使用作用UIScrollView可 ...
- php的几个实用正则表达式
更多内容推荐微信公众号,欢迎关注: 此文章是网上搜索而来: 对于开发人员来说,正则表达式是一个非常有用的功能,它提供了 查找,匹配,替换 句子,单词,或者其他格式的字符串.这篇文章主要介绍了15个超实 ...
- Python的类变量和成员变量、类静态方法和类成员方法
先说明几个相关的术语:attribute.function.method. attribute:类对象的数据成员.我们经常会在Python代码出错时遇到:“AttributeError: 'My_Cl ...
- Html5使用history对象history.pushState()和history.replaceState()方法添加和修改浏览历史记录
根据网上参考自己做个笔记:参考网址:http://javascript.ruanyifeng.com/bom/history.html history.pushState() HTML5为histor ...
- java 面试题总结(一)
从网上找了些面试题,自己手工总结了理解了一下,如有理解错误,还请指正. java基础 1.String 为什么是final的? https://www.zhihu.com/question/3 ...
- Flip Bits
Determine the number of bits required to flip if you want to convert integer n to integer m. Notice ...
- 虚拟机使用主机ss代理
环境Linux mint 设置好主机ss代理,并开启[允许来自局域网的链接] 在Linux虚拟机的system setting-network手动设置代理 地址全部填入刚刚的主机地址,端口号为主机ss ...
- C#基础学习之StreamReader和StreamWriter
StreamReader和StreamWriter操作字符的 FileStream操作字节的 //使用StreamReader读取文件 using (StreamReader sr=new Strea ...