python云端系统开发(Django)MOOC笔记整理week3(B)Django的视图响应类型

本文主要介绍了Django的视图响应类型,包括HttpResponse类及其子类如JsonResponse、StreamingHttpResponse和FileResponse的使用方法,并给出了相关代码示例。通过HttpResponse设置内容、类型和状态码,JsonResponse用于返回JSON数据,StreamingHttpResponse支持流式响应,FileResponse则用于响应文件。
摘要由CSDN通过智能技术生成

视图函数编写原则
视图函数接受HTTP请求并返回响应,可以放在任何地方,可以是任何功能
视图函数可以返回Web文本、页面、重定向、错误、图片等任何内容
视图函数通过HttpResponse、JsonResponse等类表达并返回响应
按约定,视图函数放在对应app中的views.py文件中

Django的响应类型

HttpResponse类及子类(共10个)

在这里插入图片描述
在这里插入图片描述
HttpResponse(content,content_type=None,status=200,chaeset=None)
content:拟返回的字符串
content_type:MIME格式的返回内容类型
status:响应状态码
charset:响应的字符
打开pycharm,在cloudms文件夹的urls.py文件中,增加对根目录的路由指定

#cloudms/urls.py
from django.contrib import admin
from django.urls import include, path
from msgapp import views as msgviews

urlpatterns = [
    path('msggate/', include('msgapp.urls')),
    path('admin/', admin.site.urls),
    path('', msgviews.homeproc2),
    path('playground/', msgviews.pgproc)

]

#/cloudms/msgapp/views.py
from django.shortcuts import render
from datetime import datetime
from django.http import HttpResponse
from django.template import Template, Context

# Create your views here.
def msgproc(request):
    datalist = []
    if request.method == "POST":
        userA = request.POST.get("userA", None)
        userB = request.POST.get("userB", None)
        msg = request.POST.get("msg", None)
        time = datetime.now()
        with open('msgdata.txt', 'a+') as f:
            f.write("{}--{}--{}--{}--\n".format(userB, userA,\
                            msg, time.strftime("%Y-%m-%d %H:%M:%S")))
    if request.method == "GET":
        userC = request.GET.get("userC", None)
        if userC != None:
            with open("msgdata.txt", "r") as f:
                cnt = 0
                for line in f:
                    linedata = line.split('--')
                    if linedata[0] == userC:
                        cnt = cnt + 1
                        d = {"userA":linedata[1], "msg":linedata[2]\
                             , "time":linedata[3]}
                        datalist.append(d)
                    if cnt >= 10:
                        break
    return render(request, "MsgSingleWeb.html", {"data":datalist})

def homeproc(request):
    return HttpResponse("<h1>这是首页,具体功能请访问<a href='./msggate'>这里</a></h1>")

运行,得到页面在这里插入图片描述
在这里插入图片描述
用类的形式编写代码:

#/cloudms/msgapp/views.py
from django.shortcuts import render
from datetime import datetime
from django.http import HttpResponse
from django.template import Template, Context

# Create your views here.
def msgproc(request):
    datalist = []
    if request.method == "POST":
        userA = request.POST.get("userA", None)
        userB = request.POST.get("userB", None)
        msg = request.POST.get("msg", None)
        time = datetime.now()
        with open('msgdata.txt', 'a+') as f:
            f.write("{}--{}--{}--{}--\n".format(userB, userA,\
                            msg, time.strftime("%Y-%m-%d %H:%M:%S")))
    if request.method == "GET":
        userC = request.GET.get("userC", None)
        if userC != None:
            with open("msgdata.txt", "r") as f:
                cnt = 0
                for line in f:
                    linedata = line.split('--')
                    if linedata[0] == userC:
                        cnt = cnt + 1
                        d = {"userA":linedata[1], "msg":linedata[2]\
                             , "time":linedata[3]}
                        datalist.append(d)
                    if cnt >= 10:
                        break
    return render(request, "MsgSingleWeb.html", {"data":datalist})

def homeproc(request):
	response = HttpResponse()
    response.write("<h1>这是首页, 具体功能请访问<a href='./msggate'>这里</a></h1>")
    response.write("<h1>这是第二行</h1>")
    return response
    #return HttpResponse("<h1>这是首页,具体功能请访问<a href='./msggate'>这里</a></h1>")

运行,得到界面
在这里插入图片描述

JsonResponse类

JsonResponse(data)
data:字典类型,返回的JSON类型函数

from django.shortcuts import render
from datetime import datetime
from django.http import HttpResponse, JsonResponse
from django.template import Template, Context

# Create your views here.
def msgproc(request):
    datalist = []
    if request.method == "POST":
        userA = request.POST.get("userA", None)
        userB = request.POST.get("userB", None)
        msg = request.POST.get("msg", None)
        time = datetime.now()
        with open('msgdata.txt', 'a+') as f:
            f.write("{}--{}--{}--{}--\n".format(userB, userA,\
                            msg, time.strftime("%Y-%m-%d %H:%M:%S")))
    if request.method == "GET":
        userC = request.GET.get("userC", None)
        if userC != None:
            with open("msgdata.txt", "r") as f:
                cnt = 0
                for line in f:
                    linedata = line.split('--')
                    if linedata[0] == userC:
                        cnt = cnt + 1
                        d = {"userA":linedata[1], "msg":linedata[2]\
                             , "time":linedata[3]}
                        datalist.append(d)
                    if cnt >= 10:
                        break
    return render(request, "MsgSingleWeb.html", {"data":datalist})

def homeproc(request):
    response = HttpResponse()
    response.write("<h1>这是首页, 具体功能请访问<a href='./msggate'>这里</a></h1>")
    response.write("<h1>这是第二行</h1>")
    return response
    #return HttpResponse("<h1>这是首页,具体功能请访问<a href='./msggate'>这里</a></h1>")

def homeproc1(request):
    response = JsonResponse({'key': 'value1'})

在这里插入图片描述

StreamingHttpResponse类

StreamingHttpResponse(streaming_content)
streaming_content:内容的迭代器形式,以内容流的方式响应

FileResponse类

FileResponse(stream)
stream:以流形式打开的文件

from django.shortcuts import render
from datetime import datetime
from django.http import HttpResponse, JsonResponse, FileResponse
from django.template import Template, Context
import os

# Create your views here.
def msgproc(request):
    datalist = []
    if request.method == "POST":
        userA = request.POST.get("userA", None)
        userB = request.POST.get("userB", None)
        msg = request.POST.get("msg", None)
        time = datetime.now()
        with open('msgdata.txt', 'a+') as f:
            f.write("{}--{}--{}--{}--\n".format(userB, userA,\
                            msg, time.strftime("%Y-%m-%d %H:%M:%S")))
    if request.method == "GET":
        userC = request.GET.get("userC", None)
        if userC != None:
            with open("msgdata.txt", "r") as f:
                cnt = 0
                for line in f:
                    linedata = line.split('--')
                    if linedata[0] == userC:
                        cnt = cnt + 1
                        d = {"userA":linedata[1], "msg":linedata[2]\
                             , "time":linedata[3]}
                        datalist.append(d)
                    if cnt >= 10:
                        break
    return render(request, "MsgSingleWeb.html", {"data":datalist})

def homeproc(request):
    response = HttpResponse()
    response.write("<h1>这是首页, 具体功能请访问<a href='./msggate'>这里</a></h1>")
    response.write("<h1>这是第二行</h1>")
    return response
    #return HttpResponse("<h1>这是首页,具体功能请访问<a href='./msggate'>这里</a></h1>")

def homeproc1(request):
    response = JsonResponse({'key': 'value1'})
    return response

def homeproc2(request):
    cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    response = FileResponse(open(cwd + "/msgapp/templates/PyLogo.png", "rb"))
    response['Content-Type'] = 'application/octet-stream'
    response['COntent-Disposition'] = 'attachment;filename="pylogo.png"'
    return response

在这里插入图片描述
在这里插入图片描述
Djangn请求类型的判断
django.views.decorators.http
路由不能判断HTTP请求的类型
Django通过decorators在视图函数前进行基本判断,格式如下:

from django.views.decorators.hhp import require_http_methods

@require_http_methods(["GET","POST"])
def my_view(request):
	# I am assumw now that only GET or POST requests make it this far
	# ...
	pass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值