- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
一个视图函数,简称视图,是一个简单的 Python 函数,它接受 Web 请求并且返回 Web 响应.
响应可以是一个 HTML 页面、一个 404 错误页面、重定向页面、XML 文档、或者一张图片… 。
每个视图函数都负责返回一个 HttpResponse 对象,对象中包含生成的响应.
代码写在哪里都可以,只要在 Python 目录下面,一般约定是将视图放置在项目或应用程序目录中的名为 views.py 的文件中.
视图层,熟练掌握两个对象即可: 请求对象(request) 和 响应对象(HttpResponse) 。
django视图函数必须要返回一个HttpResponse对象 否则报错:The view app01.views.func1 didn't return an HttpResponse object. It returned None instead.提示你没有返回一个Httpresponse对象而是返回了一个None.
。
为什么必须要返回这个对象呢?我们 Ctrl + 鼠标点击分别查看三者的源码来查探究竟.
class HttpResponse(HttpResponseBase): """ An HTTP response class with a string as content. This content that can be read, appended to or replaced. """ streaming = False def __init__ (self, content=b '' , *args, ** kwargs): super(HttpResponse, self). __init__ (*args, ** kwargs) # Content is a bytestring. See the `content` property methods. self.content = content
由此可得,HttpResponse()就是对象,括号内直接跟一个具体的字符串作为响应体,示例如下 。
HttpResponse(): 返回文本,参数为字符串,字符串中写文本内容。如果参数为字符串里含有 html 标签,也可以渲染。 def runoob(request): # return HttpResponse("百度首页") return HttpResponse( " <a href='https://www.baidu.com/'>百度首页</a> " )
def render(request, template_name, context=None, content_type=None, status=None, using= None): """ Returns a HttpResponse whose content is filled with the result of calling django.template.loader.render_to_string() with the passed arguments. """ content = loader.render_to_string(template_name, context, request, using= using) return HttpResponse(content, content_type, status) ''' render(request, template_name[, context])` `结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。 参数: request: 用于生成响应的请求对象。 template_name:要使用的模板的完整名称,可选的参数 context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。 render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。 '''
。
。
。
。
响应对象 。
全称:JSON的全称是"JavaScript Object Notation", 意思是JavaScript对象表示法 。
作用:前后端交互一般使用的是json实现数据的跨域传输 。
方法一:直接自己序列化 。
import json def index_func(request): user_dict = { ' name ' : ' alex ' , ' age ' : ' 18 ' , ' 性别 ' : ' 女 ' } user_json = json.dumps(user_dict,ensure_ascii= False) return HttpResponse(user_json) # 添加ensure_ascii=False 参数是为了让中文保持正常显示, 不然会转换成uncode格式
方法二:使用JsonResponse对象 。
from django.http import JsonResponse def index_func(request): user_dict = { ' name ' : ' alex ' , ' age ' : ' 18 ' , ' 性别 ' : ' 女 ' } return JsonResponse(user_dict)
。
。
问题:bJsonResponse 对象没有 ensure_ascii 参数来保证中文正常显示吗?
首先,我们来查看源码.
。
由源码可知, json_dumps_params 是一个字典,接下来我们为 json_dumps_params 传入参数.
from django.http import JsonResponse def index_func(request): user_dict = { ' name ' : ' alex ' , ' age ' : ' 18 ' , ' 性别 ' : ' 女 ' } return JsonResponse(user_dict, json_dumps_params={'ensure_ascii':False} )
ps:以后写代码很多时候可能需要参考源码及所学知识扩展功能 。
class JsonResponse(): def __init__ (self,data,json_dumps_params= None): json.dumps(data, **json_dumps_params)
JsonResponse主要序列化字典,针对非字典的其他可以被序列化的数据需要修改safe参数为False 。
from django.http import JsonResponse def index_func(request): user_list = [11,22,33,44,55 ] return JsonResponse(user_list,json_dumps_params={ ' ensure_ascii ' :False})
。
提示为了让非字典对象能够被序列化,设置safe参数为false.
我代码没有写这个啊,这是哪来的呢?
凭空捏造??且看 JsonResonse 源代码 。
加入 safe=False 参数, 让其允许非 dict 对象被序列化 。
from django.http import JsonResponse def index_func(request): user_list = [11,22,33,44,55 ] return JsonResponse(user_list,safe=False,json_dumps_params={ ' ensure_ascii ' :False})
ps: JsonResponse 返回的也是 HttpResponse 对象 。
class JsonResponse(HttpResponse): # 继承了HttpResponse ...
request.FILES # 获取文件对象
method
必须是 post
enctype
参数修改为 multipart/form-data
index_Page.html文件 。
<! DOCTYPE html > < html lang ="en" > < head > < meta charset ="UTF-8" > < title > Title </ title > < script src ="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js" ></ script > </ head > < body > < form action ="" method ="post" enctype = "multipart/form-data" > < p > file: < input type ="file" name ="file" multiple ="multiple" > </ p > < input type ="submit" value ="提交" > </ form > </ body > </ html >
views.py文件 。
from django.shortcuts import render def index_func(request): if request.method == ' POST ' : # 获取文件数据 print (request.FILES) # <MultiValueDict: {'file': [<InMemoryUploadedFile: 试卷.pdf (application/pdf)>]}> # 获取文件数据对象 file_obj = request.FILES.get( ' file ' ) print (file_obj,type(file_obj)) # 试卷.pdf <class 'django.core.files.uploadedfile.InMemoryUploadedFile'> # 获取文件对象字符串名 print (file_obj.name,type(file_obj.name)) # 试卷.pdf <class 'str'> with open(r ' %s ' % file_obj.name, ' wb ' ) as f: for line in file_obj: f.write(line) return render(request, ' indexPage.html ' )
基于视图的函数我们学习Django的时候就就已经在使用了,示例如下:
urls.py文件 。
urlpatterns = [ path( " login/ " , views.login), ]
views.py文件 。
from django.shortcuts import render,HttpResponse def login(request): if request.method == " GET " : return HttpResponse( " GET 方法 " ) if request.method == " POST " : user = request.POST.get( " user " ) pwd = request.POST.get( " pwd " ) if user == " shawn " and pwd == " 123456 " : return HttpResponse( " POST 方法 " ) else : return HttpResponse( " POST 方法1 " )
如果我们在浏览器中直接访问 http://127.0.0.1:8000/login/ ,输出结果为: GET 方法 。
视图层views.py文件 。
from django import views class MyloginView(views.View): def get(self, request): return HttpResponse( ' from CBV get function ' ) def post(self,request): return HttpResponse( ' from CBV post function ' )
路由层urls.py文件 。
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path( ' login/ ' ,views.MyloginView. as_view() ) ]
CBV会自动根据请求方法的不同自动匹配对应的方法并执行 。
path( ' login/ ' , views.MyLoginView.as_view()) # as_view() 是什么东西
我们 Ctrl + 点击查看其源码 。
发现它是一个类方法, 查看其整体结构(只看框起来的即可, 其他的不用管), 该方法内部有一个 view 方法, 并且返回值是 view 的内存地址, 类似于闭包函数 。
。
于是我们就可以得到一些初步结果 。
path( ' login/ ' , views.MyLoginView.as_view()) # 等同于下面 path( ' login ' ,views.view) # 看着是不是与普通的路由没有什么区别了 : 通过匹配触发视图函数的运行
那么 view 是一个什么样的函数呢? 现在突破口变成了 view 方法了 。
我们再看其源码(只看框起来的即可,其他的不用管)
" self = cls(**initkwargs) " # cls是什么? 记得上面的类方法吗? 类调用时传入类本身 # 我们是通过MyView来调用as_view的, 那么cls也就是MyView # 类加括号实例化得到对象self, 这个self就是我们自己的类产生的对象 : self=MyView(**initkwargs),我们不用去管里面的参数 # 接下来看看view的返回值 : self.dispatch(request, *args, **kwargs) # 也就是去MyView类实例出的对象里面去找dispatch方法并执行,很显然self对象中没有该方法,于是去类中去找,也没有 # 最后到父类View中去找,发现就在as_view类方法的下面找到了
。
我们在看它下面的逻辑代码 。
。
逻辑很简单,使用了反射的知识点 。
# 先是拿到当前请求方式的大写字符转成小写, 然后判断在不在后面的 self.http_method_names 里面 # Ctrl+点击 看看这是个什么东西 : ' http_method_names = [ ' get ' , ' post ' , ' put ' , ' patch ' , ' delete ' , ' head ' , ' options ' , ' trace ' ] ' # 发现是8种常用的请求方式列表, 接着返回dispatch源码查看,为了方便我们假设现在的是get请求方式 # 判断get请求在请求列表里面,于是执行紧跟其下的代码...我们先看看getattr()得到的是什么结果 # 判断我们的self是否有名叫get的属性或方法,如果有则返回该属性的值或方法的内存地址,否则返回 self.http_method_not_allowed, 这是个啥,我们 Ctrl+点击 也来看看:
# 原来是一个报错信息 : 提示方法不允许,整理下思路,也就是说self中有get返回值或者内存地址,没有则报错 # 很显然我们的self是有get这个名字的,并且是一个方法,于是将get方法的内存地址赋值给handler # 我们再来看dispatch的返回值 : handler + (括号), 不就是执行该方法吗!也就是执行了我们的get方法打印了"触发了get方法--->"
。
最后此篇关于Django之视图层的文章就讲到这里了,如果你想了解更多关于Django之视图层的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对 Python-Django 和 web 开发还很陌生,我被困在这个使用 POST 创建新资源的特殊问题上。 我正在为 REST API 使用 Django REST 框架,我正在尝试创建一个新资
我已经使用 Django-storages 成功地将 Word 文档存储到 S3。 class Document(TitleSlugDescriptionModel, TimeStampedModel
我有 2 个关于模型代理的问题, 如何从模型对象创建代理对象? 如何从模型查询集创建代理查询集? 例如,假设我们定义了: from django.contrib.auth.models import
我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。 如果您好奇为什么 - 那是因为我想测试我从 Django 应用程序公开的 Thrif
我为我的个人网站启动了一个 django 项目来学习 django。到目前为止,我已经将我的开发环境设置为我需要的一切,并遵循 this很棒的教程来创建一些基本的数据结构和模板。现在我想开始使用我之前
我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 here 、 here 和 here 。代码片段是: forms.py(来自注册应用程序) class Registrat
我正在编写小型社交应用程序。功能之一是在网站标题中写入用户名。因此,例如,如果我登录并且我的名字是Oleg(用户名),那么我应该看到: Hello, Oleg | Click to edit prof
我有一个使用 Django 和 Django Rest 框架开发的应用程序。我想将 django-reversion 功能添加到我的应用程序中。 我已经尝试过http://django-reversi
我有一个简单的 HTML 表单,我没有使用 Django 表单,但现在我想添加一个选择。 选择最容易创建为 Django ChoiceField (与通过循环等手动创建选择相反),但是,如果没有在 D
我不明白为什么人们以两种方式编写外键,这样做的目的是什么?它们是相同还是不同? 我注意到有些人这样写: author = models.ForeignKey(Author, on_delete=mod
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
这对于 Django 1.2 仍然有效吗? Custom Filter in Django Admin on Django 1.3 or below 我已经尝试过,但管理类中的 list_filter
问题在于,当 django-compressor 编译为 .js 文件的 CoffeeScript 文件中引用 {{ STATIC_URL }} 时,它无法正确加载。 在我的 django 模板中,我
我正在尝试将一些字段从一个 django 模型移动到一个新模型。假设我有一个书籍模型: class Book(models.Model): title = models.CharField(max
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
目前我正在寻找在 Django 中实现访问控制。我已经阅读了有关内置权限的内容,但它并不关心每个对象的基础。例如,我想要“只有创建者可以删除自己的项目”之类的权限。所以我读到了 django-guar
嗨,我正在将我的 Django 模型的一个字段的值设置为其他模型的另一个字段的值。这个值应该是动态变化的。 这是我的第一个模型 class MainModel(AbstractBaseUser, Pe
我正在尝试为我的模型创建一个编辑表单。我没有使用模型表单,因为根据模型类型,用户可以使用不同的表单。 (例如,其中一个表单有 Tinymce 小部件,而另一个没有。) 有没有什么方法可以使用模型设置表
Django 模板中的搜索字段 如何在类似于此图像的 Django 模板中创建搜索字段 http://asciicasts.com/system/photos/1204/original/E354I0
根据 Django documentation ,如果 Django 安装激活了 AuthenticationMiddleware,HttpRequest 对象有一个“user”属性代表当前登录的用户
我是一名优秀的程序员,十分优秀!