zoukankan      html  css  js  c++  java
  • 第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)
     
  • 相关阅读:
    将hdfs上的数据上传到ftp服务器(是ftp不是sftpf服务器)的脚本
    vue+elementui更换本地字体
    ps ef|grep详解
    ez_setup.py 下载后怎么安装
    Linux下4个查找命令which、whereis、locate、find的总结
    WIN7 + IIS7 Service Unavailable HTTP Error 503. The service is unavailable.
    Asp.Net Core混合使用cookie和JwtBearer认证方案
    SpringBoot2.6中使用springfox报documentationPluginsBootstrapper问题
    React笔记 #02# jsx语法规则&动态列表初步
    Hexo笔记 #01# 初始化&部署&换主题&写文
  • 原文地址:https://www.cnblogs.com/sellsa/p/10333989.html
Copyright © 2011-2022 走看看