django视图层三板斧

视图层三板斧

三板斧

  • HttpResponse
    • 返回字符串类型的数据
  • render
    • 返回HTML文件
  • redirect
    • 重定向

【一】JSonResponse

  • 路由配置
# urls.py文件
from django.urls import path
from a9902 import views

urlpatterns = [
    path('json_data/',views.json_data),
    # http://127.0.0.1:8686/json_data/
]

【1】json模块序列化

# views.py
import json
from django.shortcuts import render, HttpResponse

def json_data(request):
    user = {
        'name': 'mao', 'age': '18', 'slary': '100'
    } # 先转换成json格式的字符串
    json_str = json.dumps(user)
    # 将该字符串返回
    return HttpResponse(json_str,'dasdasd')

image-20240301203725691

  • 这种只能输出字符串类型

【2】JsonResponse对象

image-20240301204857388

from django.http import JsonResponse


def json_data(request):
    user = {
        'name': 'mao', 'age': '18你妈更年期了', 'slary': '100w回家等死就好了'
    }  # 先转换成json格式的字符串

    # 将该字符串返回
    # 查看JsonResponse的源码
    return JsonResponse(user, json_dumps_params={'ensure_ascii': False})

image-20240301205100077

  • 这里字典序列化就可以显示出来了

  • 那么用上面的方法列表序列化? ×

from django.http import JsonResponse
def json_data(request):
    # user = {
    #     'name': 'mao', 'age': '18你妈更年期了', 'slary': '100w回家等死就好了'
    # }  # 先转换成json格式的字符串

    list = [1,2,3,4,5,6,7,8,9,100]
    # 将该字符串返回
    # 查看JsonResponse的源码
    return JsonResponse(list, json_dumps_params={'ensure_ascii': False})
# In order to allow non-dict objects to be serialized set the safe parameter to False.
# 为了允许序列化非 dict 对象,请将 safe 参数设置为 False。
# 改成这样就行了
return JsonResponse(list, safe=False)

image-20240301205708593

  • 其他也是同理将safe= False 就行了

【2】表单的上传与下载

  • form表单上传文件类型的数据
    • method必须指定成post
    • enctype必须换成formdate
# urls.py
from a9902 import views

urlpatterns = [
    # JsonResponse
    path('json_data/',views.json_data),

    # from表单上传文件
    re_path(r'^file/',views.user_file),

]
# views.py文件
from django.shortcuts import render, HttpResponse
from django.http import JsonResponse

def user_file(request):
    if request.method == 'POST':
        # print(request.POST) # 只能获取普通的键值对数据  文件不行!!
        print(request.FILES)  # 获取文件数据
        # < MultiValueDict: {'file': [ < InMemoryUploadedFile: 【1】什么是视图.md(application / octet - stream) >]} >
        file_obj = request.FILES.get('file') # 文件对象
        print(file_obj.name)
        with open(file_obj.name,'wb') as f:
            for i in file_obj:
                f.write(i)
    return render(request,'user_from.html')
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="POST" enctype="multipart/form-data">
        <p>username: <input type="text" name="username"> </p>
        <p>file: <input type="file" name="file"></p>
        <input type="submit" name="submit" value="Submit">
    </form>
</body>
</html>

image-20240301213718717

【3】常用的request对象方法

​ 以下是一些常用的request对象方法和属性:

  1. request.method: 请求的HTTP方法,例如GETPOSTPUT等。
  2. request.GET: 包含GET请求参数的字典,可以通过键访问参数值。
  3. request.POST: 包含POST请求参数的字典,可以通过键访问参数值。
  4. request.FILES: 包含上传文件的字典,可以通过键访问文件对象。
  5. request.path: 请求的路径部分,不包括域名和查询参数。
  6. request.get_full_path(): 请求的完整路径,包括域名、路径和查询参数。
  7. request.is_secure(): 判断请求是否通过HTTPS协议发送。
  8. request.session: 请求的会话对象,用于在请求之间存储和访问数据。
  9. request.COOKIES: 包含请求中所有Cookie的字典,可以通过键访问Cookie值。
  10. request.user: 包含当前经过身份验证的用户对象。

​ 这里只是一部分您可以参考Django官方文档中有关request对象的更多信息:

https://www.djangoproject.com/start/overview/

image-20240301084658488

【二】cbv源码

【1】什么是查找顺序

对象属性的查找顺序:

  • 首先在对象自身的命名空间(属性字典)中查找属性。
  • 如果在对象自身的命名空间中没有找到,则会向上查找该对象的类(class)的命名空间,直到找到对应的属性或达到类的顶层(通常是 object 类)。

方法的查找顺序:

  • 首先在对象自身的类中查找方法,并调用该方法。
  • 如果在对象自身的类中没有找到方法,则会按照对象的类继承关系(即 MRO,Method Resolution Order)来查找方法,确保子类的方法优先于父类的方法被调用。

【2】如何看cbv源码

​ 需要看源码。 在看python源码的时候 一定要时刻提醒自己面向对象属性方法查找顺序

  • 先从对象自己找
  • 再去产生对象的类里面找
  • 之后再去父类找

总结: 看源码只要看到了self点一个东西 一定要问你自己当前这个self到底是谁

cbv的源码 : 突破口在urls.py

from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    # CBV源码
    re_path('r^login/',views.MyLogin.as_view()),
]
# re_path('r^login/',views.view),  这里CBV跟FBV 一模一样
# '''这里可以看出CBV跟FBV在路由匹配上本质是一样的 都是路由 对应 函数内存地址'''

# 函数名/方法名  加括号优先级最高
# 这里我们可以假设一下
	as_view()
    	要么是被@staticmethod修饰的静态方法
        要么是被@classmethod修饰的类的方法  ✓
        
	@classonlymethod
    def as_view(cls, **initkwargs):
        """Main entry point for a request-response process."""
        for key in initkwargs:
            pass
# cls 就是我们自己写的类  MyCBV
def view(request, *args, **kwargs):
    # cls 就是我们自己写的类
    # self = MyLogin(**initkwargs)  产生一个我们自己写的类的对象
    self = cls(**initkwargs)
    self.setup(request, *args, **kwargs)
'''
		需要看源码。 在看python源码的时候  一定要时刻提醒自己面向对象属性方法查找顺序

		- 先从对象自己找
		- 再去产生对象的类里面找
		- 之后再去父类找

总结: 看源码只要看到了self点一个东西  一定要问你自己当前这个self到底是谁
'''
# CBV的精华
def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    
    # 获取的当前请求的小写格式  如何对比当前请求方式是否合法
    # get请求为例子
    # post请求
    if request.method.lower() in self.http_method_names:
        handler = getattr(
            self, request.method.lower(), self.http_method_not_allowed
        )
        '''
        反射:通过字符串来操作对象的数学或者方法
        handler = getattr(自己写的类产生的对象,'get',当找不到get数学或者方法的时候机会用到第三个参数)
        handler = 我们自己写的类里面的get方法
        '''
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)

'''自动调用get方法'''

1

image-20240229225033841

2

image-20240229225449634

3

image-20240229230424144

4

else:
    handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)

‘’‘自动调用get方法’‘’




### 1

[外链图片转存中...(img-G76z1kFi-1712142225262)]

### 2

[外链图片转存中...(img-r75dM41E-1712142225262)]

### 3

[外链图片转存中...(img-K0Za3Aud-1712142225262)]

### 4

![image-20240229230949408](https://img-blog.csdnimg.cn/img_convert/248107e539bdba70c3ca3f8a06d4da04.png)
  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Django的模型、视图和模板,我可以做个简单的介绍: Django是一个MVC框架,其中的M、V、C分别指的是模型视图和控制器(其中控制器Django中对应的是URLconf),而这里的MVC与传统的MVC有所不同,更倾向于MVT的架构,即模型(Model)、视图(View)和模板(Template)。 - 模型(Model):模型主要是把应用中需要用到的数据以类似面向对象的方式进行定义、管理和操作,通常对应database中的表。Django中的ORM(Object-relational mapping)对开发者屏蔽了底的SQL操作,开发者可以直接以Python语言去操作数据库,而不需要关心底SQL的实现细节。 - 视图(View):视图最主要的作用是处理用户的请求,响应相应的结果给用户。一般来说,视图会从数据库、缓存等数据源中获取数据,然后将结果进行组装,返回HttpResponse给用户。Django视图可以通过函数或者类的方式来定义,对外提供一个可被URLconf调用的可调用对象。 - 模板(Template):模板是视图生成响应结果的主要组成部分,可以理解为一个动态生成的HTML页面,其中包含了数据展示、控制逻辑、页面渲染等元素。Django中的模板提供了超过100个内置的指令和过滤器,开发者可以非常方便的实现模板的渲染和页面的实现。 总结一下,模型主要和数据打交道,视图主要和操作和生成Http Response联系在一起,模板主要负责页面的渲染和数据展示。希望这个介绍可以帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值