• 在应用中创建视图定义路由
  • 配置文件说明
  • 静态文件使用
  • 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路由与视图的更多相关文章

  1. Django路由与视图

    路由层 一.路由匹配规则: 第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即匹配,直接执行对应的视图函数 url(r'login', views.login), 如果按上面的形 ...

  2. FROM DELETE LIBRARY TO RUN の Django路由和视图

    一.requests安装 · requests是什么? request是python实现的简单易使用的http库 · 如何安装? pip install requests ·检测是否成功 import ...

  3. Django基础(路由、视图、模板)

    目录导航 Django 路由控制 Django 视图层 Django 模版层 Django 路由控制 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用 ...

  4. Django的View(视图)和路由系统

    一.Django的View(视图) 1.介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一 ...

  5. Django Rest Framework 视图和路由

    Django Rest Framework 视图和路由   DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们 ...

  6. 【python】-- Django路由系统(网址关系映射)、视图、模板

    Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...

  7. day53_9_17 django数据库表关联,路由和视图

    一.数据库的关系建立. 在原生的数据库语句中,建立表与表之间的联系,就是添加一个字段,将联系的表的id值添加到该字段中. django所作的也就是这些. 以图书管理系统为例,图书管理系统有四张表:书籍 ...

  8. Django drf:视图层封装、ViewSetMixin、路由配置、解析器、响应器

    一.视图层封装 二.ViewSetMixin 三.路由配置 四.解析器 五.响应器 一.视图层封装 1.基本视图 写一个出版社的增删改查resfull接口 路由: url(r'^publish/$', ...

  9. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

随机推荐

  1. 为什么我要用 Node.js? 案例逐一介绍

    介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端, ...

  2. 针对用户在个人中心绑定手机认证的一些js代码。

    需求: 1:手机号码校验(格式的校验,手机号码是否已经绑定过)---未实现 2:填完手机号码,点击发送验证码,手机会收到一条信息 3:发送验证码按钮不可用,变成重新发送的倒计时 1):60秒以后又可以 ...

  3. 【leetcode 简单】 第九十七题 快乐数

    写一个程序,输出从 1 到 n 数字的字符串表示. 1. 如果 n 是3的倍数,输出“Fizz”: 2. 如果 n 是5的倍数,输出“Buzz”: 3.如果 n 同时是3和5的倍数,输出 “FizzB ...

  4. markdown小记(语法+markdownpad)

    一.有道云笔记markdown语法小记 1.目录[TOC] 2.标题# 一级标题## 二级标题...###### 六级标题 3.项目列表有序列表: 1. 1. (显示为i.) 2. 3. - (显示为 ...

  5. 【codeforces】【比赛题解】#872 CF Round #440 (Div.2)

    链接. [A]寻找漂亮数字 题意: 给定了两列非零数字.我们说一个数是漂亮的,当它的十进制表达中有至少一个数从数列一中取出,至少有一个数从数列二中取出.最小的漂亮数字是多少? 输入: 第一行两个数\( ...

  6. Tomcat安装与优化

    Tomcat安装与优化 1.安装jdk环境 最新的JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downlo ...

  7. Mysql_Learning_Notes_系统结构_1_数据类型

    数据类型 整型 1.tinyint 1Bytes -128~127(255) 2.smallint 2Bytes -32768~32676(65535) 3.mdeiumint 3Bytes -838 ...

  8. Python的日志记录-logging模块的使用

    一.日志 1.1什么是日志 日志是跟踪软件运行时所发生的事件的一种方法,软件开发者在代码中调用日志函数,表明发生了特定的事件,事件由描述性消息描述,同时还包含事件的重要性,重要性也称为级别或严重性. ...

  9. vue总结 08状态管理vuex

      状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管 ...

  10. geoserver 启动闪退

    跟JDK版本有关: 比如geoserver2.11需要JDK版本为JDK1.8 windows配置两个jdk环境: 网上有方法,但如果只需要满足geoserver的话,可以只安装jdk(注意jdk和j ...