前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django 之路由篇

Django 之路由篇

原创
作者头像
ruochen
修改2021-05-12 09:59:17
7310
修改2021-05-12 09:59:17
举报
文章被收录于专栏:若尘的技术专栏

@toc

<font color="red">欢迎阅读本专栏其他文章</font>

Django 之视图篇

Django 之 Models(Models 模型 & 数据表关系)

Django 之模板篇

Django系统

  • 环境
    • python3.6
    • django1.8
  • 参考资料 - django中文教程 - django架站的16堂课环境搭建
  • anaconda+pycharm
  • anaconda使用
    • conda list:显示当前环境安装的包
    • conda env list: 显示的安装的虚拟环境列表
    • conda create -n env_name python=3.6
    • 激活conda的虚拟环境
      • (Linux)source activate env_name
      • (win) activate env_name
    • pip install django==1.8

创建第一个django程序

  • 命令行启动
代码语言:txt
复制
    django-admin startproject my_django
代码语言:txt
复制
    cd my_django
代码语言:txt
复制
    python manage.py runserver
  • pycharm 启动 - 需要配置 - manage.py 文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

路由系统-urls

  • 创建app
    • app:负责一个具体业务或者一类具体业务的模块
    • python manage.py startapp teacher
  • 路由
    • 按照具体的请求url,导入到相应的业务处理模块的一个功能模块
    • django的信息控制中枢
    • 本质上是接收的URL和相应的处理模块的一个映射
    • 在接收URL请求的匹配上使用了RE
    • URL的具体格式如urls.py中所示
  • 需要关注两点
    1. 接受的URL是什么,即如何使用RE对传入URL进行匹配
    2. 已知URL匹配到哪个处理模块
  • url匹配规则
    • 从上往下一个一个对比
    • url格式是分级格式,则按照级别一级一级往下对比,主要对应url包含子url的情况
    • 子url一旦被调用,则不会返回到主url
      • '/one/two/three'
    • 正则以r开头,表示不需要转义,注意尖号(^)和美元符号($)
      • 'one/two/three' 配对 r'^one/'
      • '/oo/one/two/three' 不配对 r'^one/'
      • 'one/two/three' 配对 r'three/$'
      • 'oo/one/two/three/oo' 不配对 r'three/$'
      • 开头不需要有反斜杠
    • 如果从上到下都没有找到合适的匹配内容,则报错

正常映射

  • 把某一个符合RE的URL映射到事务处理函数中去
    • 举例如下:from showeast import views as sv
代码语言:txt
复制
    urlpatterns = [
代码语言:txt
复制
      url(r'^admin/', admin.site.urls),
代码语言:txt
复制
      url(r'^normalmap/', sv.normalmap),
代码语言:txt
复制
    ]
代码语言:txt
复制
    ```

URL中带参数映射

  • 在事件处理代码中需要由URL传入参数,形如 /myurl/param中的param
  • 参数都是字符串形式,如果需要整数等形式需要自行转换
  • 通常的形式如下:/search/page/432 中的432需要经常性变换,URL在app中处理
  • 如果所有应用URL都集中在MyDjango/urls.py 中,可能导致文件臃肿
  • 可以把urls具体功能逐渐分散到每个app中
    • 从django.conf.urls 导入 include
    • 注意此时RE部分的写法
    • 添加include导入
  • 使用方法
    • 确保include被导入
    • 写主路由开头的url
    • 写子路由
    • 编写views 视图
  • 同样可以使用参数URL中的嵌套参数
  • 捕获某个参数的一部分
  • 例如URL /index/page-3, 需要捕获数字3作为参数url(r'index_1/(page-(\d+)/)?$', sv.myindex_1), # 不太好 url(r'index_2/(?:page-(?P<page_number>\d+)/)?$', sv.myindex_2), # 好
  • 上述例子会得到两个参数,但 ?: 表示忽略此参数传递额外参数
  • 参数不仅仅来自于URL,还可能是我们自己定义的内容url(r'extrem/$', sv.extremParam, {'name':'ruochen'}),
  • 附加参数同样适用于include语句,此时对include内所有都添加

URL 的反向解析

  • 防止硬编码
  • 本质上是对每一个URL进行命名
  • 以后再编码代码中使用URL的值,原则上都应该使用反向解析

源代码

  • urls.pyfrom django.conf.urls import include, url from django.contrib import admin from teacher import views as tv from teacher import teacher_url urlpatterns = [ # Examples: # url(r'^$', 'MyDjango.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), # 视图函数名称只有名称,无括号和参数 url(r'normalmap/', tv.do_normalmap), # 尖号表示以后面内容开头的表达式 # 圆括号表示的是一个参数,里面的内容作为参数传递给被调用的函数 # 参数名称以问号加大写P开头,尖括号里面就是参数的名字 # 尖括号后表示正则,[0-9] 表示内容仅能是由0-9 的数字构成 # 后面大括号表示出现的次数,此处4表示只能出现四个0-9的数字 url(r'^withparam/(?P<year>[0-9]{4})/(?P<month>[0,1][0-9])', tv.withparam), # 正常映射 # 比如约定,凡是由teacher模块处理的视图的url都以teacher开头 url(r'^teacher/', include(teacher_url)), url(r'^book/(?:page-(?P<pn>\d+)/)$', tv.do_param2), url(r'^yourname/$', tv.revParse, name='askname') ]
  • teacher_url.py
代码语言:txt
复制
from django.conf.urls import url
from . import views

urlpatterns = [
    # Examples:
    # url(r'^$', 'MyDjango.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    # 视图函数名称只有名称,无括号和参数
    url(r'ruochen/', views.do_app),

]
  • views.py
代码语言:txt
复制
from django.shortcuts import render
from django.http import HttpResponse
from django.core.urlresolvers import reverse

# Create your views here.

'''
视图函数需要一个参数,类型应该是 HttpRequest
'''
def do_normalmap(request):
    print('In do_normalmap')
    return HttpResponse('This is normalmap')

def withparam(request, year, month):
    return HttpResponse('This is with param {0}, {1}'.format(year, month))

def do_app(r):
    return HttpResponse('这是个子路由')

def do_param2(r, pn):
    return HttpResponse('Page number is {0}'.format(pn))

def extremParam(r, name):
    return HttpResponse('My name is {0}'.format(name))

def revParse(r):
    return HttpResponse('Your requested URL is {0}'.format(reverse('askname')))

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Django系统
  • 创建第一个django程序
  • 路由系统-urls
    • 正常映射
      • URL中带参数映射
        • URL 的反向解析
          • 源代码
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档