Django学习小记(三)-----路由系统、视图系统

一、路由系统

1.1 文件内容

  • 功能: 将路由与视图函数做映射
  • 文件路径:/main/main/urls.py,见上篇文件目录
  • 网址:域名+路由
    • 域名:https://www.baidu.comhttp://127.0.0.1:8000/
    • 路由://api//api?pwd=123
    • 浏览器:注意–>默认会在网址末尾加/

1.2 路由分类

1.2.1 固定路由

  • 释义:精确匹配路由和函数关系
  • 主应用代码(/main/main/urls.py)
    django.urls import path  				# 默认就有
    from api import views   				# 调用应用api(文件夹)中的views.py文件
      
    urlpatterns = [	    
    
    	# 调用views.py中的index函数,路由前会自动加“/”,即“/api/”;路由别名:name
     	path("api/", views.index, name="api_index"), 
     	
    ]
    
  • 自定义应用代码(/main/api/views.py
    from django.shortcuts import redirect
    from django.urls import reverse
    
    def index(request):
    	return redirect(reverse("api_index"))	# 转到http://127.0.0.1:8000/api/
    

1.2.2 通配符路由

  • 释义:使用正则表达式批量匹配路由
  • 主应用代码(/main/main/urls.py)
    from django.urls import re_path    	# 导入通配符路由函数re_path
    from api import views   			# 调用应用api(文件夹)中的views.py文件
    
    urlpatterns = [
      re_path(r"^$", views.index),      # 空路由会被匹配到这里,即“/”
    ]
    
  • 通配符表
    格式描述格式描述
    ^严格匹配字符串开头$严格匹配字符串末尾
    .任意字符,除了换行符a?0、1个a
    a+>0个aa*>=0个a
    [amk]匹配 ‘a’,‘m’或’k’ ,[0-2]为0、1、2[^amk]匹配 ‘a’,‘m’,’k’之外的字符
    [0-1]{3}精确匹配n个表达式,000、111[0-1]{2,3}匹配00、11、000、111
    (表达式)分组匹配(表达式1)|(表达式2)表达式的或语句
    \d匹配任意数字,等价[0-9]\w匹配包括下划线的任何单词字符,
    等价:[A-Za-z0-9_]和_
    \s匹配任意空白字符\S匹配任意空白字符

1.2.3 路由分发

  • 释义: 将路由引导入Django的app应用中的分路由文件中继续分发
  • 主应用代码(/main/main/urls.py)
    from django.urls import include     #导入路由分发函数include
    from api1 import urls as api1urls
    
    urlpatterns = [	    
    
      # 路由分发,api1/会导向应用api1中的urls.py文件(自己加)
      path("api1/", include(api1urls) 
    ]
    
  • api1应用中代码(新建文件 /main/api1/urls.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
    
    	# 此处路径为"http://127.0.0.1:8000/api1/cal/"
        path('cal/', views.calculate),	
        
        # 此处路径为"http://127.0.0.1:8000/api1/“
        path("", views.index),	
    ]
    

1.2.4 路由分组

分组:将路由中与正则表达式匹配的数据转成变量传给视图函数

  • 无名分组
    • 主应用代码(/main/main/urls.py
      from django.urls import path, re_path
      from api import views
      
      urlpatterns = [
      
          # [0-9]{2}会传给自定义应用中的视图中的month,注意”小括号“
          re_path("^index/([0-9]{2})/([0-9]{4})/$",views.index),
          
      ]
      
    • 自定义应用代码(/main/api/views.py
      from django.shortcuts import HttpResponse
      
      # year, month会接收主应用传过来的参数,注意“有顺序”
      def index(request,month, year):	
          print('the year is ', year, 'the month is ', month)  # 在pycharm终端显示
          return HttpResponse('按顺序一一对应传参')
      

  • 有名分组
    • 主应用代码(/main/main/urls.py
      from django.urls import path, re_path
      from api import views
      
      urlpatterns = [
      
          # 用 ”?P<组名>“ 定义组名,以组名向视图函数传参,无顺序
          re_path("^index/(?P<month>[0-9]{2})/(?P<year>[0-9]{4})/$",views.index),
          
      ]
      
    • 自定义应用代码(/main/api/views.py
      from django.shortcuts import HttpResponse
      
      # year,month会根据组名接收主应用传过来的参数
      def index(request,year, month):		# 注意此处与主应用路由顺序相反,仍能传参
          print('the year is ', year, 'the month is ', month)  # 在pycharm终端显示
          return HttpResponse('按组名一一对应传参')
      

二、视图函数

定义:负责接收请求(request),进行逻辑处理,并返回响应(response)的函数
文件位置:自定义应用代码(/main/api/views.py

2.1 请求体

写法返回值描述
request.method请求方法:字符串针对数据库:查’GET’,增’POST’,改’PUT’,删’DELETE’
request.POST.get(“user”)请求值:字符串获取请求键值对中,键‘user’对应的值
request.path请求路由:字符串获取请求的路由,例如:‘/index/’

2.2 FBV模式

  • 定义:function base views,基于函数的视图,就是在视图里使用函数处理请求
  • 示例代码:
    from django.shortcuts import HttpResponse, redirect
    
    def login(request):							 # 可以传多个参数,但第一个必须为request
        if request.method == "GET":				 # 获得请求方法名称,GET:查数据,request无请求体
            return HttpResponse("GET 方法")		 # 向浏览器响应文本信息
        if request.method == "POST":			 # 请求方法名称,POST:增数据,request有请求体
            user = request.POST.get("user")		 # 获得请求体中user的值
            pwd = request.POST.get("pwd")		 # 获得请求体中pwd的值
            if user == "runoob" and pwd == "123456":
                return HttpResponse("登录验证成功")
            else:
            	# 重定向到路由为login的界面,也可为HttpResponseRedirect("https://baidu.com")
                return redirect("/") # 重定向发送的是get请求
    
    • 下载postman发送请求
      在这里插入图片描述

错误403:防跨站攻击(CSRF),测试时注释掉setting.py中中间件#'django.middleware.csrf.CsrfViewMiddleware',一行即可

2.3 CBV模式

  • 定义:class base views,基于类的视图,就是在视图里使用类处理请求
  • url.py路由写法:path('', views.index.as_view()),只多了as_view()这一段
  • 示例代码:
    from django.shortcuts import HttpResponse, redirect
    from django.http import JsonResponse		# json模块
    from django.views import View				# 导入View基类
    
    class login(View):							# CBV必须继承这个类
    
        def get(self,request):					# 类按请求方法,将请求分发给不同类内的函数
            return HttpResponse("GET 方法")
    
        def post(self,request):					# 类按请求方法,将请求分发给不同类内的函数
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            if user == "jane" and pwd == "123456":
            	data = {
               	 	'name': 'zhangsan',
                	'age': 18,
            	}
            	return JsonResponse(data)		# 给浏览器返回json数据格式,配合axios使用
            else:
                return redirect("/")			# 重定向发送的是get请求
    

跳转至总篇目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值