Django路由

Django 框架

该文档使用的Djangoi框架版本是2.2

Django 框架介绍

Django,发音为[`dʒæŋɡəʊ],是用python语言写的开源web开发框架,并遵循MVC设计。劳伦斯出版集团为了开发以新闻内容为主的网站,而开发出来了这个框架,于2005年7月在BSD许可证下发布。这个名称来源于比利时的爵士音乐家DjangoReinhardt,他是一个吉普赛人,主要以演奏吉它为主,还演奏过小提琴等。由于Django在近年来的迅速发展,应用越来越广泛,被著名IT开发杂志SDTimes评选为2013SDTimes100,位列"API、库和框架"分类第6位,被认为是该领域的佼佼者。Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(DoNotRepeatYourself)原则。

点击查看django官方网站
点击查看django源码
点击查看2.2官方中文文档

Django框架遵循MVC设计,并且有一个专有名词:MVT

MVT各部分的功能

  • M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。

  • V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。

  • T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。

在这里插入图片描述

安装django

pip install django==2.2

命令行创建django项目

django-admin startproject 项目名称

项目默认目录说明

当项目创建完成后,所目录结构为以下结构
在这里插入图片描述

  • manage.py是项目管理文件,通过它管理项目。
  • 与项目同名的目录,此处为test1。
  • __ init __.py是一个空文件,作用是这个目录test1可以被当作包使用。
  • settings.py是项目的整体配置文件。
  • urls.py是项目的URL配置文件。
  • wsgi.py是项目与WSGI兼容的Web服务器入口,详细内容会在布署中讲到。

创建一个应用

这里的应用代表一个web的模块.与flask的蓝图相似

创建命令如下

python manage.py startapp 应用名称

python manage.py startapp booktest

应用默认目录说明

此时的项目结构如下:
在这里插入图片描述

  • __ init.py __是一个空文件,表示当前目录booktest可以当作一个python包使用。
  • tests.py文件用于开发测试用例,在实际开发中会有专门的测试人员,这个事情不需要我们来做。
  • models.py文件跟数据库操作相关。
  • views.py文件跟接收浏览器请求,进行处理,返回页面相关。
  • admin.py文件跟网站的后台管理相关。
  • migrations文件夹之后给大家介绍。(数据库迁移目录)

对默认项目结构中的settings.py文件内容进行说明

其中的内容为:

"""
Django settings for day01 project.

Generated by 'django-admin startproject' using Django 2.2.

For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)

# 获取项目根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
# csrf和session值加密的数据
SECRET_KEY = 'n*43h5ovfe(=!9cevt59bww0c-4fye9g_o(8*sj948xbieeezr'

# SECURITY WARNING: don't run with debug turned on in production!
# 是否为debug模式
DEBUG = True

# 允许范围的主机列表,* 号代表所有
ALLOWED_HOSTS = ['*']

# Application definition

# 安装应用
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'App'  # 把创建的应用进行安装
]

# 中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# 根路由所在的目录
ROOT_URLCONF = 'day01.urls'

# templates文件模板所在目录配置 
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')] # 配置模板目录,默认在app下
        , 
        'APP_DIRS': True,# 如果有这个选项,首先在app下面找tempatles
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# 项目的入口
WSGI_APPLICATION = 'day01.wsgi.application'

# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

# 数据库配置
#DATABASES = {	# 默认的sqlite3配置
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
#}

# mysql配置 ,需要下载 mysqlclient
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "blog1",
        'USER': "root",
        'PASSWORD': "root",
        'HOST': "localhost",
        'PORT': "3306"

    }
}


# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators

#身份验证密码验证器	django自带的用户认证
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
# 语言,默认是英文
LANGUAGE_CODE = 'zh-hans'	# 已经修改为了中文

TIME_ZONE = 'Asia/Shanghai'	# 已经修改为了中文

USE_I18N = True

USE_L10N = True

# 是否使用世界时,建议不使用,改为false,数据库存储的时间和当地时间一直
# USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

# 静态资源的请求目录
STATIC_URL = '/static/'

STATICFILES_DIRS = [	# 静态资源static的文件目录
    os.path.join(BASE_DIR, "static")
]

视图

用户通过在浏览器的地址栏中输入网址请求网站,对于Django开发的网站,由哪一个视图进行处理请求,是由url匹配找到的。

配置路由

在 项目/settings.py 中通过ROOT_URLCONF指定url配置,默认已经有此配置。

# 根路由所在的目录
ROOT_URLCONF = '项目.urls'

打开 项目/urls.py可以看到默认配置。

from django.contrib import admin
from django.urls import path, include, register_converter

urlpatterns = [
    path('admin/', admin.site.urls)
]

注意点

  • 在 项目/urls.py中进行包含配置,在各自应用中创建具体配置。
  • 定义urlpatterns列表,存储path()对象,这个名称是固定的。
语法

path对象,被定义在django.conf.urls包中,有两种语法结构:

语法一:包含,一般在自定义应用中创建一个urls.py来定义url。

这种语法用于项目/urls.py中,目的是将应用的urls配置到应用内部,数据更清晰并且易于维护。

path('路由前缀\',include('应用.urls'))
image-20200309203445253

如示例在项目/urls.py文件,包含App应用的urls。

urlpatterns = [
    path('admin/', admin.site.urls),
    # 在根路由下包含子路由
    # user/ 路由前缀
    path("user/", include("App.urls"))
]

语法二:定义,指定URL和视图函数的对应关系。

在应用内部创建urls.py文件,指定请求地址与视图的对应关系

path("路由",视图函数名称)
path对象有四个参数
  • 模式串:匹配用户的请求路径的字符串(和flask一样.不过斜杆写在后面)
  • 视图函数:匹配上用户指定的请求路径后调用的视图函数名
  • kwargs:可选参数,需要额外传递的参数,一个字典
  • 名称(name):给路由命名.在代码中可以使用name进行反向解析(由name获取用户请求路径)

另外,如果path中模式串不能满足你的路由规制,还可以使用re_path对象来,re_path对象中的模式串是正则表达式,其他三个参数和path的参数一样

django的请求处理流程
  • Django获取用户的请求
  • Django在工程配置文件settings.py中通过ROOT_URLCOF配置来确定根URLconf
  • Django在URLconf中的所有url模式中,查找第一个匹配的条目
  • 如果找到匹配,将调用相应的视图函数,将HttpRequest对象传入
  • 视图函数返回一个HttpRespons响应对象

在这里插入图片描述

动态url

前面写的url都是静态的,无法给视图函数传递数据,要想给视图函数传参数, url 必须是动态,带有参数,但Django主张漂亮简介的url,所以不会使用查询字符串(/hello?name=tom),而是采用通配符:

path("hello/<name>/",views.hello)
path("show/<name>/<int:age>",views.show)
re_path(r'^hello/(\w+)/$',views.hello)   #http://localhost:8000/hello/tom/

以上是使用Djaono的几个常用的内置装换器:

  • str:如果没有指定参数类型,默认是字符串类型。字符串参数可匹配除/和空字符外的其他字符串
  • int: 匹配0和正整数,视图函数的参数将得到一个整型值
  • slug:匹配由数字、字母、- 组成的字符串参数
  • path:匹配任何非空字符串,包括/。

在re_path中,() 部分是怎则的组,django在经行url匹配规则时,就会把匹配成功的内容.作为参数传递给视图函数,有两种形式:

  • 位置参数,url中的正则表达式组,和视图函数中的参数一一对应,函数参数名可以随意指定

    位置参数:hello/name/age
    re_path(r'^hello/(\w+)/(\d{1,2})/$',views.hello)
    
    # 视图函数
    def hello(req,value1,value2)# 参数名称随意,但从左往右和url对应
    
  • 关键字参数

  • 对正则表达式分组进行命名

    ?P<组名>
    re_path(r'^hello/(?P<name>\w+)/(?P<age>\d{1,2})/$',views.hello),
    
    
    # 视图函数
    def hello(req,name,age): 
     	return HttpResponse("哈喽" + name + " age= {}".format(age))
    
匹配/分组算法
  • 在一个匹配模式中,要么使用命名分组,要么使用无命名分组.不能同时使用
  • 请求的url被看做时一个普通的pyton字符串,urlconf在其上面查找并匹配,进行匹配时将不包括GET或POST请求方的参数以及域名,换句话讲,对同一个URL的无论是POST请求、GET请求、或HEAD请求方法等等- --都将路由到相同的函数。
  • 每个捕获的参数都作为-个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式。

下面将展示转换器的例子:

urlpatterns = [
    # 首页
    path('', views.index, name="index"),

    # str类型 默认的类型
    path('change/<name>/', views.change, name="change"),

    # int类型
    # 一个视图可以添加多个视图函数
    path('show/', views.show, name="name"),
    path('show/<int:num>/', views.show, name="name"),

    # slug:匹配由数字、字母、-_和_ 组成的字符串参数
    path('list/<slug:name>/', views.list, kwargs={"admin": "赵姑娘"}, name="list"),

    # path:匹配任何非空字符串,包括/。
    path('access/<path:path>', views.access, name="access"),

    # 正则匹配 ,命名匹配
    re_path(r"^ret/(?P<phone>(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8})/$", views.ret, kwargs={"age": 18}),

    # 正则匹配 ,命名匹配
    re_path(r"^ret1/(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}/$", views.ret1, kwargs={"num": 18}),

    # 使用自定义转换器
    path("zdy/<re_converter:number>/", views.zdy, name="zdy")
]

视图函数:

from django.http import JsonResponse, HttpResponse
from django.shortcuts import render


def index(request):
    # 使用render添跳转到模板上去
    return render(request, "index.html", context={"title": "首页", "name": "钟文强"})
    # return HttpResponse("这里是首页")


def change(request, name):
    print("成功了")
    return HttpResponse(name)


def show(request, num=100):
    print(num, type(num))
    return HttpResponse(num)


def list(request, name, admin):
    print(name, type(name))
    print(admin, type(admin))
    return JsonResponse([name, admin], safe=False)


def access(request, path):
    print(path, type(path))
    return HttpResponse(path)


def ret1(request, tr, num):
    print(tr, type(tr))
    print(num, type(num))
    return JsonResponse({"phone": tr, "age": num, "name": "这里是无命名组匹配的手机号"})


# Create your views here.
def ret(request, phone, age):
    print(phone, type(phone))
    print(age, type(age))
    return JsonResponse({"phone": phone, "age": age})


def zdy(request, number):
    print(number)
    return HttpResponse(number)

在根url下配置的自定义装换器

from django.urls import path, include, register_converter

from exaple02led.converter import ReConverter

register_converter(ReConverter, "re_converter")

自定义转换器的内容:

# 自定义装换器

class ReConverter(object):

    """
    regex 类属性,字符串类型
    to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
    to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
    """

    regex = "12345678"

    def to_python(self, value):
        return value

    def to_url(self, value):
        return "12345678"

发布了2 篇原创文章 · 获赞 1 · 访问量 64
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览