• Django入门3



    以下是本篇文章正文内容。

    一、Django的视图层

    Model的View视图

    Django框架中的视图(View)是用来负责处理用户请求和返回响应的逻辑程序
    • 视图(View)简而言之就是一个Python的函数或方法,接受处理Web请求。
    • 视图的响应可以是网页的HTML内容,重定向或404错误,XML文档或图像。
    • 视图的代码按惯例是放置一个名为views.py的文件中,此文件放在项目或应用程序目录中。
    (其实视图文件名可以自己定义)
    这个地方就要引入几个需要创建的对象。

    1.HttpResponse对象

    • 在django.http模块中定义了HttpResponse对象的API
    • HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建
    • 在每一个视图函数中必须返回一个HttpResponse对象,当然也可以是HttpResponse子对

    2.HttpRequest对象

    属性说明
    path一个字符串,表示请求的页面的完整路径,不包含域名
    method一个字符串,表示请求使用的HTTP方法,常用值包括:‘GET’、'POST’
    encoding一个字符串,表示提交的数据的编码方式: 一般为utf-8
    GET一个类似于字典的对象,包含get请求方式的所有参数
    POST一个类似于字典的对象,包含post请求方式的所有参数
    FILES一个类似于字典的对象,包含所有的上传文件
    COOKIES一个标准的Python字典,包含所有的cookie,键和值都为字符串
    session一个既可读又可写的类似于字典对象,表示当前会话,需Django 启用会话才可用
    方法说明
    is_ajax()如果请求是通过XMLHttpRequest发起的,则返回True

    3.QueryDict对象

    • request对象的属性GET、POST都是QueryDict类型的对象
    • 与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况

    方法get():根据键获取值
    只能获取键的一个值
    如果一个键同时拥有多个值,获取最后一个值
    
    方法getlist():根据键获取值
    将键的值以列表返回,可以获取一个键的多个值
    dict.getlist('键',default)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.验证码实操

    from django.shortcuts import render
    from django.http import HttpResponse,HttpResponseNotFound,Http404,JsonResponse
    from django.shortcuts import redirect
    from django.urls import reverse
    from django.views import View
    
    # 创建视图
    def index(request):
        #模板返回数据
        return render(request,"myapp/index.html")
    
    def resp01(request):
        return HttpResponse("

    一个简单的视图

    "
    ) def resp02(request): # 返回一个404 #return HttpResponseNotFound('

    Page not found

    ')
    # 返回一个404的错误页面 raise Http404("Poll does not exist") #重定向 def resp03(request): # redirect重定向 reverse反向解析url地址 #return redirect(reverse('resp01')) # 执行一段js代码,用js进行重定向 return HttpResponse('') #视图类的定义 class MyView(View): def get(self, request, *args, **kwargs): return HttpResponse('Hello, Views!') #json数据的响应 def resp05(request): data = [ {'id':1001,'name':'zhangsan','age':20}, {'id':1002,'name':'lisi','age':22}, {'id':1003,'name':'wangwu','age':23}, ] return JsonResponse({"data":data}) #cookie的使用 def resp06(request): # 读取 m = request.COOKIES.get('num',None) if m: m = int(m)+1 else: m = 1 # 获取当前的 响应对象 response = HttpResponse('cookie记录的计数器值:'+str(m)) # 使用响应对象进行cookie的设置 response.set_cookie('num',m) # 返回响应对象 return response #测试request对象 def resp07(request): print("请求路径",request.path) print("请求方法",request.method) print("请求编码",request.encoding) #print(request.GET) print(request.GET['id']) print(request.GET.get('name')) print(request.GET.get('age',0)) return HttpResponse("测试request请求对象") #验证码的输出 def verifycode(request): #引入绘图模块 from PIL import Image, ImageDraw, ImageFont #引入随机函数模块 import random #定义变量,用于画面的背景色、宽、高 bgcolor = (random.randrange(20, 100), random.randrange( 20, 100), 255) width = 100 height = 25 #创建画面对象 im = Image.new('RGB', (width, height), bgcolor) #创建画笔对象 draw = ImageDraw.Draw(im) #调用画笔的point()函数绘制噪点 for i in range(0, 100): xy = (random.randrange(0, width), random.randrange(0, height)) fill = (random.randrange(0, 255), 255, random.randrange(0, 255)) draw.point(xy, fill=fill) #定义验证码的备选值 str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0' #随机选取4个值作为验证码 rand_str = '' for i in range(0, 4): rand_str += str1[random.randrange(0, len(str1))] #构造字体对象 font = ImageFont.truetype('static/ariali.ttf', 23) #font = ImageFont.load_default().font #构造字体颜色 fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255)) #绘制4个字 draw.text((5, 2), rand_str[0], font=font, fill=fontcolor) draw.text((25, 2), rand_str[1], font=font, fill=fontcolor) draw.text((50, 2), rand_str[2], font=font, fill=fontcolor) draw.text((75, 2), rand_str[3], font=font, fill=fontcolor) #释放画笔 del draw
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110

    二、Django的模板层

    1.介绍

    • 作为Web 框架,Django 需要一种很便利的方法来动态地生成HTML。常见做法是使用模板。
    • 模板包含所需HTML 输出的静态部分,以及一些特殊的语法,描述如何将动态内容插入。
    • 模板任务就是输出数据,输出方式:直接输出,过滤输出、判断输出,循环输出

    如何使用模板:

    1. 在项目的settings.py配置文件中配置模板目录
    'DIRS': [os.path.join(BASE_DIR,'templates')],
    2. 在应用的视图文件加载模板,并放置要输出的数据
    return render(request,“目录/模板文件.html”,{放置字典数据})
    3. 在模板文件中使用变量、标签和过滤器等输出信息
    {{ 变量 }} {% 标签 %} {{ 变量|过滤器 }}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.语法

    • 变量的输出
    • 模板的标签
    • 模板的过滤器
    • 模板的注释
    • 模板中的运算
    • 自定义标签或过滤器

    3.模板继承

    • 模板继承可以减少页面内容的重复定义,实现页面内容的重用
    • 典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复
    定义
    • block标签:在父模板中预留区域,在子模板中填充
    • extends继承:继承,写在模板文件的第一行

    from django.shortcuts import render
    from django.http import HttpResponse,JsonResponse
    from datetime import datetime
    from myapp.models import District
    
    def index(request):
    	return render(request,"myapp/index.html") 
    
    def demo1(request):
    	'''模板的语法'''
    	context={}
    	context['name']="ZhangSan"
    	context['a'] = [10,20,30]
    	context['stu'] = {"name":"lisi","age":20}
    	data=[
    		{"name":"张翠山","sex":1,"age":40,'state':0},
    		{"name":"殷素素","sex":0,"age":38,'state':2},
    		{"name":"张无忌","sex":1,"age":20,'state':1},
    		{"name":"赵敏","sex":0,"age":18,'state':1},
    	]
    	context['dlist']=data
    	context['time'] = datetime.now
    	context['m1']=100
    	context['m2']=20
    	return render(request,"myapp/demo1.html",context)
    
    def demo2(request):
    	'''模板继承'''
    	return render(request,"myapp/demo2.html")
    
    # 加载城市级联信息操作模板
    def showdistrict(request):
        return render(request,"myapp/district.html")
    
    #加载对应的城市信息函数,返回json数据格式
    def district(request,upid=0):
    	dlist = District.objects.filter(upid=upid)
    	mylist = []
    	for ob in dlist:
    		mylist.append({'id':ob.id,'name':ob.name})
    	return JsonResponse({'data':mylist})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    vue3+Element-plus el-select 下拉表格组件(el-select+el-table结合)
    关于安卓Handler内存泄漏及解决方案
    电脑桌面透明便签软件是哪个?
    lotus MaxStorage 限制存储空间使用
    web期末大作业 用HTML+CSS做一个漂亮简单的节日网页【传日文化节日中秋节】
    Mysql技术文档--慢mysql的优化--工作流--按步排查
    【数据结构】排序(2)快速排序
    centos 创建账号,启用sudo权限
    javascript中的继承
    第1关:Hive 的 Alter Table 操作
  • 原文地址:https://blog.csdn.net/m0_56969616/article/details/126316132