django_day03
django_day03
Django的view(视图)
CBV和FBV
FBV:function based view 基于函数的视图
CBV:class based view 基于类的视图
from django.views import View class Xxx():
def get(self,request):
#专门处理get请求
return response
def post(self,request):
#专门处理post请求
return responseurl(r'xx/',Xxx.as_view())
class PublisherAdd(View): def get(self,request):
print("get请求被执行")
#处理get请求
return render(request, 'publisher_add.html') def post(self,request):
print("post请求被执行")
#处理post请求
pub_name = request.POST.get('pub_name')
#print(pub_name)
if not pub_name:
# 输入为空
return render(request, 'publisher_add.html', {'error': '不能为空!!'})
if models.Publisher.objects.filter(name=pub_name):
return render(request, 'publisher_add.html', {'error': '已存在!'})
ret = models.Publisher.objects.create(name=pub_name)
#print(ret, type(ret))
return redirect('/publisher_list/')
urlpatterns = [
url(r'^publisher_add/', views.PublisherAdd.as_view()),
]
as_view流程
项目运行时加载urls.py的文件 执行类as_view方法
as_view()执行后 内部定义了一个view函数 并且返回
请求到来的时候,执行view函数:
实例化类--》self
self.request = request
执行self.dispatch(request, *args, **kwargs)的方法
判断请求方式是否被允许
允许:
通过反射获取请求方式对应的请求方法 ——》 handler
获取不到 self.http_method_not_allowed ——》 handler
不允许:
self.http_method_not_allowed ——》 handler
执行handler,返回结果
from functools import wraps def timer(func):
@wraps(func)#不加的话获取的方法一直时inner wraps原理
def inner(request, *args, **kwargs): start = time.time()
ret = func(request, *args, **kwargs)
print('执行的时间是:{}'.format(time.time() - start))
return ret return inner
FBV
直接加在函数上就行
CBV加装饰器:
需要使用一个装饰器
from django.utils.decorators import method_decorator
加在方法上
@method_decorator(timer)
def get(self, request):
加在dispatch方法上
@method_decorator(timer)
def dispatch(self, request, *args, **kwargs):
# 之前的操作
ret = super().dispatch(request, *args, **kwargs) # 执行View中的dispatch方法
# 之后的操作
return ret3 @method_decorator(timer,name='dispatch')
class PublisherAdd(View):
加在类上
@method_decorator(timer,name='post')
@method_decorator(timer,name='get')
class PublisherAdd(View):
request
request.method 请求方法 GET POST
request.GET URL上携带的参数 ?k1=v1&k2=v2 { }
request.POST post请求提交的数据 {} 编码方式是URLencode
request.path_info 路径信息 不包含IP和端口 也不包含参数
request.body 请求体 bytes类型 #post请求才有 数据
request.COOKIES cookie
request.session session
request.FILES 长传的文件
request.META 头的信息 小写——》大写 HTTP_ 开头 - ——》 _ request.get_full_path() 完整的路径信息 不包含IP和端口 包含参数
request.is_ajax() 请求是否是ajax请求response
from django.shortcuts import render, HttpResponse, redirect HttpResponse('字符串') # 返回字符串
render(request,'模板的文件名',{'k1':v1}) # 返回一个HTML页面
redirect('地址') # 重定向 Location:‘地址’ 301 302
from django.http.response import JsonResponse
JsonResponse({'k1':'v1'})
JsonResponse(data,safe=False)
上传文件
urls.py
url(r'^upload/', views.Upload.as_view()),
视图:
class Upload(View): def get(self, request):
return render(request, 'upload.html')
def post(self, request):
file = request.FILES.get('f1')
with open(file.name, 'wb') as f:
for i in file:
f.write(i)
return HttpResponse('ok')
upload.html
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %} <input type="file" name="f1">
<button>上传</button>
</form>
django_day03的更多相关文章
随机推荐
- Eclipse历史版本下载和选择对应的java版本
下载Eclipse 官网: https://www.eclipse.org/ 直达 直接进入连接:https://www.eclipse.org/downloads/packages/installe ...
- SAP APO - Architecture
SAP APO体系结构由多个组件组成-数据库,BI环境包含InfoCube和实时缓存. InfoCube是BI数据集市的一部分,实时缓存是您保留与计划和调度有关的所有数据的主要区域. 您可以在实时缓存 ...
- React技巧之处理tab页关闭事件
原文链接:https://bobbyhadz.com/blog/react-handle-tab-close-event 作者:Borislav Hadzhiev 正文从这开始~ 总览 在React中 ...
- gitlab和jenkins做持续集成构建教程
背景介绍 上一个轮回,我花了三篇文章的时间着重向大家介绍了在条件有限的情况下,如果优雅地进行前端发版和迭代.庆七一,热烈庆祝香港回归,人民生活水平越来越好,昨天上午我自掏腰包买了台服务器,决定由冷兵器 ...
- [ARC087D] Squirrel Migration 补题记录
题目链接 简要题意: 给你一个\(N\)个节点的树,求一个\(1\cdots N\)的排列\((p_1,p_2,\cdots p_N)\) ,使得\(\sum dist(i,p_i)\)最大. 求这样 ...
- 【CSP-J 2021】总结
前言:程不在长,能过则行.码不在多,无虫则灵.斯是信竞,惟吾爆零.线段维护快,树状跳的勤.数论剩余系,图论前向星.无数竞之推理,无物竞之劳形.大佬楼教主,超奆姚期智,神犇云:您太强了. 早上5:00就 ...
- 我的sql没问题为什么还是这么慢|MySQL加锁规则
前言 前阵子参与了字节跳动后端青训营,其中大项目编写涉及到数据持久化一般选择使用MySQL.由于时间原因,数据库使用我选择了无脑三板斧:1. 建立了索引加速查询.2. 关闭自动提交事务.3. 在需要确 ...
- 沙漠世界1.0 c++小游戏
#include<bits/stdc++.h> #include<time.h> #include<windows.h> #include<stdlib.h& ...
- Vue 配置代理
说明:这里的vue代理是指用vue静态服务器做代理.使用的是 http-proxy-middleware 这个模块(这个模块相当于是node.js的一个插件). 版本: vue-cli 3.0以上 修 ...
- 浅谈 exgcd
众所周知欧几里得算法是: \[\gcd(a,b)=\gcd(b,a\bmod \,b) \] 也叫辗转相除法. 拓展欧几里得算法(exgcd),可以用来找到形如 \(ax+by=\gcd(a,b)\) ...