django视图+上传文件

  • HttpResponse,render,redirect
  • JsonResponse对象
  • form表单上传文件
  • request对象方法
  • FBV与CBV

HttpResponse,render,redirect


## HttpResponse()
括号内直接跟一个具体的字符串作为响应体


## render()
"""
render(request, template_name[, context])

参数:
    1、request:用于生成响应的请求对象,固定必须传入的第一个参数
    2、template_name:要使用的模板的完整名称,必须传入,render默认会去templates目录下查找模板文件
    3、context:可选参数,可以传入一个字典用来替换模块文件中的变量

render:返回html页面 并且在返回给浏览器之前还可以给html文件传值。
"""

## render简单内部原理
from django.shortcuts import render,redirect,HttpResponse,reverse

def index(request):
    from django.template import Template,Context
    res = Template('<h1>{{ user }}</h1>')
    con = Context({'user':{'username':'jason','password':123}})
    ret = res.render(con)
    print(ret)
    return HttpResponse(ret)


## redirect()
"""
返回重定向信息
"""
def my_view(request):
    ...
    return redirect('/some/url/')

# 重定向的地址也可以是一个完整的URL:
def my_view(request):
    ...
    return redirect('http://www.baidu.com/') 

JsonResponse对象


## 向前端返回json数据第一种方式
import json
def my_view(request):
    data=['egon','kevin']
    return HttpResponse(json.dumps(data, ensure_ascii=False) )

## 向前端返回json数据第二种方式
from django.http import JsonResponse
def ab_json(request):

    # 读源码掌握用法(JsonResponse内部调用json.dumps())
    return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})

    # 当数据不是字典时要加safe
    # 不加safe报错信息:In order to allow non-dict objects to be serialized set the safe parameter to False.
    # l = [111,222,333,444,555]
    # return JsonResponse(l,safe=False)
    #默认safe=True代表只能序列化字典对象,safe=False代表可以序列化字典以外的对象

form表单上传文件

"""
form表单上传文件类型的数据
	1.method必须指定成post
	2.enctype必须换成multipart/form-data

## form.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" 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">
</form>
</body>
</html>
"""
def ab_file(request):
    if request.method == 'POST':
        # print(request.POST)  # 只能获取普通的简直对数据 文件不行
        print(request.FILES)  # 获取文件数据
        # <MultiValueDict: {'file': [<InMemoryUploadedFile: u=1288812541,1979816195&fm=26&gp=0.jpg (image/jpeg)>]}>
        file_obj = request.FILES.get('file')  # 文件对象
        print(file_obj.name)
        with open(file_obj.name,'wb') as f:
            for line in file_obj.chunks():  # 推荐加上chunks方法 其实跟不加是一样的都是一行行的读取
                f.write(line)

    return render(request,'form.html')

request对象方法

"""
request.method
request.POST
request.GET
request.FILES # 获取文件数据
request.body  # 原生的浏览器发过来的二进制数据  后面详细的讲
request.path  # 获取完整的url路径
request.path_info # 获取完整的url路径
request.get_full_path()  # 能过获取完整的url及问号后面的参数 
"""
print(request.path)  # /app01/ab_file/
print(request.path_info)  # /app01/ab_file/
print(request.get_full_path())  # /app01/ab_file/?username=jason

FBV与CBV

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


# FBV(function base view)
## 我们平常在写django时一直使用的都是FBV
def index(request):
  return HttpResponse('index')


# CBV(class base view)
## urls.py
urlpatterns = [
    # CBV路由
    url(r'^login/',views.MyLogin.as_view()) # 必须调用类下的方法as_view
]

## views.py
from django.views import View

## 能够直接根据请求方式的不同直接匹配到对应的方法执行
class MyLogin(View):
    def get(self,request):
          return render(request,'form.html')

    def post(self,request):
          return HttpResponse('post方法')
posted @ 2020-05-27 22:18  清轩挽长风  阅读(289)  评论(0编辑  收藏  举报