Django中的函数视图和类视图以及路由的定义方式

Written by

in

文章目录
  • 函数视图它是一个标准的Python函数 函数视图中, 第一个参数必须定义: 第一个参数为请求对象, 用于接收用户发送的请求报文. 在函数视图中, 必须返回响应对象: 用于构成响应报文, 并响应给用户 请求对象: HTTPRequest() 对应的对象 响应对象: HTTPResponse() 对应的对象 from django import http # 创建一个函数视图 def text_view(request): “”” 函数视图 :param request:包含请求报文信息,请求对象 :return: 响应对象,用于构造响应报文,并响应给用户 “”” # 响应数据调用http return http.HTTPResponse(“数据data”) 这里如果有请求路径相同, 但是请求方式不同, 就需要在函数视图内加一个判断 def text_view(request): “”” 函数视图 :param request:包含请求报文信息,请求对象 :return: 响应对象,用于构造响应报文,并响应给用户 “”” # 先判断请求方法是什么如”GET”,”POST” if request.method == “GET”: # 处理GET请求 return http.HTTPResponse(“数据data”) elif request.method == “POST”: # 处理POST请求 return http.HTTPResponse(“数据data”) 在一些接口需要限制请求方式时可以使用装饰器require_http_methods from django.views.decorators.http import require_http_methods # 添加一个装饰器进行限制,请求方式大写 @require_http_methods([‘GET’]) def text_view(request): “”” 函数视图, 限制请求方式,只能使用GET进行访问,其他访问方式会报错405 :param request:包含请求报文信息,请求对象 :return: 响应对象,用于构造响应报文,并响应给用户 “”” # 响应数据调用http return http.HTTPResponse(“数据data”)
  • 类视图是一个Python类 定义类视图时需要继承Django中的提供的父类视图 View 在类视图中 需要定义跟请求方法同名的函数来对应不同的请求方式 在请求方法同名的函数中,还必须定义一个接收请求的参数(跟函数视图一样) 在请求方法同名的函数中, 也必须返回一个相应对象 from django.views import View class CodeView(View): “”” 类视图 “”” def get(self, request) “”” 处理GET请求 “”” return http.HttpResponse(“数据”) def post(self, request) “”” 处理POST请求 “”” return http.HttpResponse(“数据”) …
  • 定义路由的方法:path()、re_path()、url() Django1.x版本:url() Django2.x版本:path()、re_path() 说明: 为了在版本迭代中,保留旧版本的路由系统,url()在新版中依然可用。 并新增了一个url()的替代方案re_path(),所以url()几乎跟re_path()一样。 路由方法对比 path() # 函数视图path()路由语法: # path(‘网络地址正则表达式’, 函数视图名), # 类视图path()路由语法: # path(‘网络地址正则表达式’, 类视图.as_view()), path()路由语法中,不需要定义正则表达式严格的开头和结尾,因为已经封装好了 re_path()、url() # 函数视图re_path()路由语法: # re_path(r’^网络地址正则表达式$’, 函数视图名), # 类视图re_path()路由语法: # re_path(r’^网络地址正则表达式$’, 类视图.as_view()), # 函数视图url()路由语法: # url(r’^网络地址正则表达式$’, 函数视图名), # 类视图url()路由语法: # url(r’^网络地址正则表达式$’, 类视图.as_view()), re_path()和url()路由语法中,必须要定义正则表达式严格的开头和结尾
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Django进阶深入理解使用类视图和中间件示例 Django rest framework使用类视图实现首页API Django serializer优化类视图的实现示例 Django通用类视图实现忘记密码重置密码功能示例 django如何通过类视图使用装饰器 django 类视图的使用方法详解
  • 目录
    • 函数视图
    • 类视图
    • 路由
      • 总路由
      • 函数视图的路由
      • 类视图定义路由
    • 总结

      Django允许接收的请求方法

      http_method_names = [‘get', ‘post', ‘put', ‘patch', ‘delete', ‘head', ‘options', ‘trace']

      1. 函数视图它是一个标准的Python函数
      2. 函数视图中, 第一个参数必须定义: 第一个参数为请求对象, 用于接收用户发送的请求报文.
      3. 在函数视图中, 必须返回响应对象: 用于构成响应报文, 并响应给用户
      • 请求对象: HTTPRequest() 对应的对象
      • 响应对象: HTTPResponse() 对应的对象
      from django import http
      
      # 创建一个函数视图
      def text_view(request):
      	"""
      	函数视图
      	:param request:包含请求报文信息,请求对象
      	:return: 响应对象,用于构造响应报文,并响应给用户
      	"""
      	# 响应数据调用http
      	return http.HTTPResponse("数据data")
      

      这里如果有请求路径相同, 但是请求方式不同, 就需要在函数视图内加一个判断

      def text_view(request):
      	"""
      	函数视图
      	:param request:包含请求报文信息,请求对象
      	:return: 响应对象,用于构造响应报文,并响应给用户
      	"""
      
      	# 先判断请求方法是什么如"GET","POST"
      	if request.method == "GET":
      		# 处理GET请求
      		return http.HTTPResponse("数据data")
      	elif request.method == "POST":
      		# 处理POST请求
      		return http.HTTPResponse("数据data")
      

      在一些接口需要限制请求方式时可以使用装饰器require_http_methods

      from django.views.decorators.http import require_http_methods
      
      # 添加一个装饰器进行限制,请求方式大写
      @require_http_methods(['GET'])
      def text_view(request):
      	"""
      	函数视图, 限制请求方式,只能使用GET进行访问,其他访问方式会报错405
      	:param request:包含请求报文信息,请求对象
      	:return: 响应对象,用于构造响应报文,并响应给用户
      	"""
      	# 响应数据调用http
      	return http.HTTPResponse("数据data")
      

      类视图是一个Python类

      定义类视图时需要继承Django中的提供的父类视图 View

      在类视图中

      • 需要定义跟请求方法同名的函数来对应不同的请求方式
      • 在请求方法同名的函数中,还必须定义一个接收请求的参数(跟函数视图一样)
      • 在请求方法同名的函数中, 也必须返回一个相应对象
      from django.views import View
      
      
      class CodeView(View):
      	"""
      	类视图
      	"""
      	def get(self, request)
      		"""
      		处理GET请求
      		"""
      		return http.HttpResponse("数据")
      
      	def post(self, request)
      		"""
      		处理POST请求
      		"""
      		return http.HttpResponse("数据")
      
         		...
      
      

      定义路由的方法:path()、re_path()、url()

      • Django1.x版本:url()
      • Django2.x版本:path()、re_path()

      说明:

      • 为了在版本迭代中,保留旧版本的路由系统,url()在新版中依然可用。
      • 并新增了一个url()的替代方案re_path(),所以url()几乎跟re_path()一样。

      路由方法对比

      • path()
      # 函数视图path()路由语法:
      # path('网络地址正则表达式', 函数视图名),
      
      # 类视图path()路由语法:
      # path('网络地址正则表达式', 类视图.as_view()),
      path()路由语法中,不需要定义正则表达式严格的开头和结尾,因为已经封装好了
      
      • re_path()、url()
      # 函数视图re_path()路由语法:
      # re_path(r'^网络地址正则表达式$', 函数视图名),
      
      # 类视图re_path()路由语法:
      # re_path(r'^网络地址正则表达式$', 类视图.as_view()),
      # 函数视图url()路由语法:
      # url(r'^网络地址正则表达式$', 函数视图名),
      
      # 类视图url()路由语法:
      # url(r'^网络地址正则表达式$', 类视图.as_view()),
      re_path()和url()路由语法中,必须要定义正则表达式严格的开头和结尾
      
      

      在Django中一个子应用对应一个总路由

      总路由中,使用include()子应用里面的所有路由都包含在工程总路由中

      from django.contrib import admin
      from django.urls import path, include
      
      urlpatterns = [
          # 自带的后台管理系统的总路由:可以忽略
          path('admin/', admin.site.urls),
      
          # 总路由包含子路由语法
          # path('网络地址前缀/', include('子应用.urls')),
          # 或者
          # path('', include('子应用.urls')),
      
      	# 例: 
          # 用户模块:http://127.0.0.1:8000/users/register/
          path('', include('users.urls')),
      ]
      
      

      from django.urls import path
      
      # 把当前文件下的视图文件导进来
      from . import views
      
      
      # urlpatterns是被Django自动识别的路由列表变量:定义该应用的所有路由信息
      urlpatterns = [
          # 函数视图路由语法:
          # path('网络地址正则表达式', 函数视图名),
      
      	# 例:
          # 用户注册:http://127.0.0.1:8000/users/register/
          path('users/register/', views.register),
      ]
      
      

      from django.urls import path
      
      from . import views
      
      # urlpatterns是被Django自动识别的路由列表变量:定义该应用的所有路由信息
      urlpatterns = [
          # 类视图路由语法:
          # path('网络地址正则表达式', 类视图.as_view()),
      
          # 用户注册:http://127.0.0.1:8000/users/register/
          path('users/register/', views.RegisterView.as_view()),
      ]
      
      

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

      您可能感兴趣的文章:

      • Django进阶深入理解使用类视图和中间件示例
      • Django rest framework使用类视图实现首页API
      • Django serializer优化类视图的实现示例
      • Django通用类视图实现忘记密码重置密码功能示例
      • django如何通过类视图使用装饰器
      • django 类视图的使用方法详解

      站内搜索