当前位置: 首页 > article >正文

Django框架之视图层

【一】三板斧

【1】HttpResponse

  • 返回字符串类型

【2】render

  • 返回html页面,并且在返回给浏览器之前还可以给html页面传值

【3】redirect

  • 重定向页面

在视图文件中写视图函数的时候不能没有返回值了,默认返回的是None,页面上就会报错

def render(request, template_name, context=None, content_type=None, status=None, using=None):
    content = loader.render_to_string(template_name, context, request, using=using)
    return HttpResponse(content, content_type, status)

【二】JsonReponse序列化类的使用

序列化
json格式的数据
{"a":1}
json有什么用:
    跨语言传输
序列化:json.dumps
反序列化:json.loads

from django.http import JsonResponse
def index(request):
    user_dict = {'username':'kevin你好'}
    user_dict = [1, 2, 3, 4]
    res=json.dumps(user_dict,ensure_ascii=False)
    return  HttpResponse(res)
    #通过看源码学技术
    return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
    return JsonResponse(user_dict,safe=False)
    return render(request,'index.html')

【三】form表单文件上传下载

form表单上传数据以及后端如何获取

form知识回顾

<form action="" method="post" enctype="multipart/form-data"></form>
  • form表单想要上传文件类型的数据
    • method 参数必须改为post
    • enctype 参数必须指定成 form-data 类型

【2】数据处理

(1)POST请求数据
print(request.POST) # 接收的都是普通的数据,非文件数据
    <MultiValueDict: {'myfile': [<InMemoryUploadedFile: 234.png (image/png)>]}>
print(request.FILES) # 只接受文件数据,普通数据还在request.POST里面
def index(request):
    user_dict = {'username':'kevin你好'}
    user_dict = [1, 2, 3, 4]
    res=json.dumps(user_dict,ensure_ascii=False)
    return  HttpResponse(res)
    # 通过看源码学技术
    return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
    return JsonResponse(user_dict,safe=False)
    return JsonResponse(user_dict,safe=False)
    <QueryDict: {'myfile': ['234.png']}>
    <QueryDict: {}>
    print(request.POST)
    <MultiValueDict: {'myfile': [<InMemoryUploadedFile: 234.png (image/png)>]}>
    file_obj=request.FILES.get('myfile')
    file_list = file_obj.name.split('.') # 123.png
(2)文件数据获取
    import uuid
    random_str=str(uuid.uuid4())
    file_name = random_str + file_obj.name.split('.')[-1]
    with open(file_name, 'wb') as f:
         for line in file_obj:
             f.write(line)
    print(request.body) # 接收纯原生的二进制数据,没有任何的处理 b''----> str---->decode---->dict...
    print(request.POST.get('')) # 之所以你能够直接按照字典的方式取值,是因为django给做了封装
    print(request.path)  # /index/  /index/
    print(request.path_info) # /index/   /index/
    print(request.get_full_path()) # /index/  /index/?a=1&b=2
    print(request.GET.get(''))
    return render(request,'index.html')

【四】总结request对象方法

【1】request.method

  • request.method:该方法返回客户端用于发起请求的HTTP方法。例如,可以是'GET'、'POST'、'PUT'、'DELETE'等。您可以使用该方法来确定请求的类型,并相应地执行特定操作。

【2】request.POST

  • request.POST:该属性是一个类似字典的对象,包含了请求中通过POST方法发送的所有参数。这些参数通常是通过HTML表单发送的。您可以使用参数的名字作为键来访问单个参数,例如request.POST['username']

【3】request.GET

  • request.GET:类似于request.POST,该属性包含了请求中通过GET方法发送的所有参数。这些参数通常会附加在URL之后,以问号分隔。您可以使用参数的名字作为键来访问单个参数,例如request.GET['page']

【4】request.FILES

  • request.FILES:该属性是一个类似字典的对象,包含了请求中通过文件上传组件发送的所有文件。当表单中包含文件上传字段时,通过request.FILES可以访问上传的文件。您可以使用文件的名字作为键来访问单个文件,例如request.FILES['file']

【5】request.path

只能获取到路由地址,无法获取到参数

  • request.path:该属性表示请求URL中的路径部分。它包含在域名之后,在任何查询参数之前。例如,如果请求的URL是"http://example.com/foo/bar/",那么request.path将为"/foo/bar/"。

【6】request.path_info

只能获取到路由地址,无法获取到参数

  • 用于表示请求URL的路径部分,不包括域名和查询参数。
  • 与 request.path 相比,request.path_info 更加原始和未经解析。它保留了URL路径中的任何编码、特殊字符或斜杠等信息。
  • 例如,对于以下请求URL:"http://example.com/foo/bar/?page=2",request.path_info 的值将是 "/foo/bar/"。
  • 通常情况下,您可以使用 request.path 来获取丢弃域名后的路径,而使用 request.path_info 来获取原始的、未解析的路径。这在某些情况下非常有用,例如当您需要对URL进行一些自定义操作或路由处理时。

【7】request.get_full_path()

即能获取到路由地址又能获取到完整的路由地址后面的参数

  • request.get_full_path():该方法返回请求URL的完整路径,包括路径部分和任何查询参数。当您需要将完整URL作为字符串使用时,这个方法非常有用。例如,如果请求的URL是"http://example.com/foo/bar/?page=2",request.get_full_path()将返回"/foo/bar/?page=2"。
     

【四】FBV与CBV引入

视图函数既可以是函数也可以是类

【1】FBV

def index(request):
    return HttpResponse('index')

【2】CBV

(1)CBV的写法
from django.views import View


class MyLogin(View):
    def get(self, request):
        print('get。。。')
        return HttpResponse("get")

    def post(self, request):
        return HttpResponse("hello postman!!!")
    
url(r'^login/', views.MyLogin.as_view()),
(2)CBV的源码分析
# 入口
url(r'^login/', views.MyLogin.as_view()),

# View类中得as_view方法的返回值是view函数名
# 当请求来的时候,会触发view函数的执行
def view(request, *args, **kwargs):
    # cls:Mylogin()------>self对象
    self = cls(**initkwargs)
    return self.dispatch(request, *args, **kwargs)  # View类里的dispatch

def dispatch(self, request, *args, **kwargs):
    if request.method.lower() in self.http_method_names:
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)

from django.views import View


class MyLogin(View):
    http_method_names = ['get', 'post']
    def get(self, request):
        print('get。。。')
        self.index()
        return HttpResponse("get")

    def post(self, request):
        return HttpResponse("hello postman!!!")

    def index(self):
        pass
    
权限、频率、jwt的源码

MBV和CBV各有各的特点,都有应用

  • CBV特点
    • 能够直接根据请求方式的不同直接匹配到对应的方法执行
(3)小结
  • 选择使用 FBV 还是 CBV 取决于具体的需求和个人偏好。
  • FBV 相对简单直观,适合编写简单的视图逻辑;
  • 而 CBV 可以通过继承和重写类来实现代码复用和可扩展性,适用于复杂的视图处理场景。
  • 在实际开发中,可以根据需求选择适合的方式来编写视图处理函数或类。


http://www.kler.cn/a/131676.html

相关文章:

  • C++中sort()函数的greater<int>()参数
  • Android 12 客制化修改初探-Launcher/Settings/Bootanimation
  • CAN总线负载及CANoe查看总线负载率
  • 开源与闭源:驾驭大模型未来的关键决断
  • 开关电源测试之输出暂态响应测试标准及方法详解
  • 【Python 千题 —— 基础篇】输出列表平均值
  • asp.net在线考试系统+sqlserver数据库
  • 【入门篇】1.1 redis 基础数据类型详解和示例
  • homeassiant主题
  • 深入理解Java自定义异常与全局异常处理 @RestControllerAdvice
  • 面试其他注意事项
  • 解决 vue3 element 表格和图片预览样式有冲突
  • Word软件手动安装Zotero插件
  • vmware安装MacOS以及flutter遇到的问题
  • vscode终端npm install报错
  • 【电路笔记】-快速了解无源器件
  • 飞书开发学习笔记(七)-添加机器人及发送webhook消息
  • van-dialog弹窗异步关闭-校验表单
  • 三、Eureka注册中心
  • TSINGSEE视频汇聚管理与AI算法视频质量检测方案