131 视图层的cbv/fbv和文件上传

复习

1 web应用
	-通过浏览器访问的服务
	-cs/bs
	-基于socket
	
2 http协议
	-http协议版本,0.9 1.1 2.x 3.x  有什么异同
	-请求头和响应头的key-value
	-请求协议
		-请求首行:请求方式 地址 协议和版本
		-请求头
		-请求体
	-响应协议
		-响应首行:协议版本 状态码 状态
		-响应头
		-响应体:html css js
	-特点
		-基于socket
		-基于请求响应
		-无状态无连接
	-url:统一资源定位符
  
3 web框架
	-wsgiref(socket的封装)自己写了一个web框架
	-django,flask(同步框架)  tornado,sanic,fastapi(异步框架)...
	-其他socket服务器(都遵循WSGI协议)
		-wsgiref,uwsgi(c语言写的),tornado,gunicorn(python写的)
		-一般是uwsgi+django
		-一般是gunicorn+flask
	
4 django
	-安装(虚拟环境),创建项目,创建app
	-配路由,写视图函数,models
	-静态文件配置
	-路由配置
		-url函数、re_path、path函数,四个参数
		-有名,无名分组
		-路径后是否加/
		-路由分发,include
		-反向解析(通过别名拿到路径)
		-名称空间
		-2.x的转换器(5种内置)
		-自定义转化器
		
5 视图层
	-request对象
		-请求方法
		-get请求参数,地址栏中的参数
		-post请求参数,请求体中的参数(nama=lqz&paw=123),有的格式取不出来
		-http://127.0.0.1:8000/login/?name=lqz 向这个地址发送post请求
	-response对象
		-三件套
		
6 模型层
	-可以创建表,可以删除表,可以新增字段、删除字段(不能创建数据库)
	-默认使用sqlite(如果使用mysql,需要设置)
	-写类、写字段
	-数据迁移,两条命令
	
7 模版层
	-{{变量}}

8 请求生命周期 mtv和mvc
	
	
web微信如何做的?(服务端主动向客户端推送消息)
	-轮询(不断去问)
	-长轮询(也是不断去问,但每次要等待一段时间,web微信使用这个)
	-websocket(主动推送消息,应用层协议)
	

1 视图层之请求对象

def index(request):
    '''
    request:django封装的对象,它的类是WSGIRequest,它里面包含了所有http请求的东西
    '''
    print(request)
    print(type(request))
    # from django.core.handlers.wsgi import WSGIRequest
    #######################1 讲过的
    print(request.method)
    print(request.GET)
    print(request.POST)

    ########################2 新讲的path,get_full_path,META,FIELS,body
    # 自定制请求头
    # 上传文件使用的编码方式是form-data,默认编码方式urlencoded
    print(request.is_ajax()) # 是不是ajax请求
    print(request.path)      # 请求路径
    print(request.get_full_path()) # 请求全路径,带数据

    # print(request.body)      # 请求体,二进制,如果传文件,这个报错
    '''
    使用form表单,默认情况下数据被转成name=lqz&password=123放到请求体中
    request.POST其实是从body中取出bytes格式的,转成了字典
    requet.GET其实是把路径中?后面的部分拆出来,转成了字典
    '''
    print(request.encoding) # 客户端向服务端传递时,使用的编码方法

    print(request.META)    # 重点,字典,一堆东西,请求用户的ip地址,请求头中数据,用户自定制请求头的数据
    '''
    把请求头的key值部分统一加HTTP_  并且全部转成大写
    '''
    print(request.META['REMOTE_ADDR'])  # 客户端的ip地址
    print(request.FILES)  # 客户端上传的文件



    ########################3 暂时不用关注(后面会讲)
    print(request.COOKIES) # 空字典
    print(request.session) # session对象
    print(request.user)    # 匿名用户
    return HttpResponse('ok')

2 视图层之响应对象

### 重点:JsonResponse的使用(看源码)

def index(request):
    # 三件套
    # return HttpResponse('ok')
    # return render(request,'index.html',context={'name':'lqz','age':18})
    # return redirect('/home') # 重定向自己的地址,重定向第三方地址,经常跟反向解析一起使用

    # 向客户端返回json格式数据
    # import json
    # res=json.dumps({'name':'刘清政','age':18},ensure_ascii=False)
    # return HttpResponse(res)
    # django内置提供的JsonResponse
    # 本质还是HttpResponse

    # ensure_ascii
    # return JsonResponse({'name':'刘清政','age':18},json_dumps_params={'ensure_ascii':False})
    # safe,转换除字典以外的格式,需要safe=False
    return JsonResponse([11,12,13,'lqz',[1,2,3],{'name':'lqz','age':19}],safe=False)

3 cbv和fbv

cbv基类的视图(class based view)
fbv基于函数的视图(function based view)
之前写的都是fbv,写的视图函数

写视图类
# 第一步,写一个类,继承View
from django.views import View

class Cls9(View):
	def get(self):  # 当url匹配成功,get请求,会执行它
		return HttpResponse('GET ok!')

	def post(self):
		return HttpResponse('POST ok!')

# 第二步,配置路由
path('index/', views.Index.as_view()),

# 前期,全是FBV,后期,drf全是CBV

4 文件上传

## html注意编码方式
<form action="/index/" method="post" enctype="multipart/form-data">

    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="file" name="myfile"></p>
    <p><input type="submit" value="提交"></p>
</form>

# views.py
def index(request):
    file=request.FILES.get('myfile')
    # 打开一个空文件,写入
    with open(file.name,'wb') as f:
        for line in file.chunks():
            f.write(line)
    return HttpResponse('文件上传成功')

5 postman软件

模拟发送http请求

6 form表单,提交地址

# action
#1 不写,默认向当前地址发送请求
#2 /index/,向当前域(http://127.0.0.1:8000/)的/index/发送请求
#3 http://127.0.0.1:8000/index/,向该地址发送请求(可以向第三方服务发送请求)

# method
# 1 post:发送post请求(默认编码情况下:以key=value&key=value的形式拼到请求体中)
# 2 get:发送get请求(以key=value&key=value的形式拼到路径中)
<form action="/index/" method="post">

    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="text" name="password"></p>
    <p><input type="submit" value="提交"></p>
</form>

作业

1 写一个项目,统计用户访问日志,记录用户的ip地址和访问时间,访问地址, 存到mysql数据库

2 基于类的视图, 写一个文件上传的功能, 通过后缀名限制, 只能上传图片

3 整理视图层请求对象,响应对象, cbv, fbv, 文件上传功能到博客

4 # 研究cbv源码执行过程,写出执行过程

5 # 研究django WSGIRuquest类,文件类, request.GET的类, 深入理解各个对象的属性和方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值