第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)
 
原文地址:https://www.cnblogs.com/sellsa/p/10333989.html