• 在应用中创建视图定义路由
  • 配置文件说明
  • 静态文件使用
  • 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. codeforces997C Sky full of stars

    传送门:http://codeforces.com/problemset/problem/997/C [题解] 注意在把$i=0$或$j=0$分开考虑的时候,3上面的指数应该是$n(n-j)+j$ 至 ...

  2. 【51nod】1766 树上的最远点对

    [题意]给定n个点的树,m次求[a,b]和[c,d]中各选出一个点的最大距离.abcd是标号区间,n,m<=10^5 [算法]LCA+树的直径理论+线段树 [题解] 树的直径性质:距离树上任意点 ...

  3. 2017中国大学生程序设计竞赛 - 网络选拔赛 1004 HDU 6153 A Secret (字符串处理 KMP)

    题目链接 Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a presen ...

  4. Django认证系统实现的web页面

    结合数据库.ajax.js.Djangoform表单和认证系统的web页面 一:数据模块 扩展了Django中的user表,增加了自定义的字段 from django.db import models ...

  5. 20、List集合中特有的方法

    List里面的特有方法简介 List中除了Collection里面的方法以外,内部还有一些方法,通过这些方法,开发者可以更方便的操作List接口的实现类. package com.monkey1024 ...

  6. static_cast、dynamic_cast、reinterpret_cast、和const_c

    ;double dval = 3.14159; ival + dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 int *pi =  ...

  7. Servlet笔记4--ServletConfig接口和ServletContext接口

    ServletConfig接口: ServletContext接口: 代码详解: (1)web.xml配置文件: <?xml version="1.0" encoding=& ...

  8. python3之pymysql模块

    1.python3 MySQL数据库链接模块 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Pyt ...

  9. iBt(001-004)原文与试译

    Unit 001 Basic building materials include: timber, mud, stone, marble, brick, tile, steel, and cemen ...

  10. maven profile 优先级

    maven profile是有优先级别 也就是说在setting.xml的profile优先级比pom中同名的profile高. 可以使用 mvn help:active-profiles 这个命令是 ...