开发者

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: python响应对象,用于构造响应报文,并响应给用户
    	"""
    	# 响应数据调用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 imp编程ort path
    
    from . import views
    
    # ur编程lpatterns是被Django自动识别的路由列表变量:定义该应用的所有路由信息
    urlpatterns = [
     编程   # 类视图路由语法:
        # path('网络地址正则表达式', 类视图.as_view()),
    
        # 用户注册:http://127.0.0.1:8000/users/register/
        path('users/register/', views.RegisterView.as_view()),
    ]
    
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜