视图函数编写原则
视图函数接受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