1.1. MVC(models view controller)和MTV(models template views) 2
1.5. CBV(class base view)和FBV(function base views) 3
3.3. xss(cross-site scripting attack)跨站脚本攻击 6
MTV和MVC本质上都是一样的,
MTC也就是我们所写的,M是模块,T是模板层,views是视图层
只不过MVC中把路由和views拼接成了一个控制器,并且v变成了模板层.
1.如果在模板的form表单中不写method,默认是get请求.
一般请求数据或者请求页面的时候用get请求
一般向服务器提交数据的时候用post请求
2.request.GET返回的是一个字典
3.request.POST返回的是一个字典
4.通过request.method返回请求的类型
5.http://127.0.0.1:8000/index/ppp/dddd/?name=lqz
协议:ip地址和端口(在命令终端用ping指令转换)/路径?参数(数据)
6.request.path()只获取路径,而request.get_full_path()获取路径+参数
用于返回响应的内容,通常在该函数内加上响应头,一般是通过该函数把响应请求返回给用户
用于渲染模板层,通过把数据层的东西提交给模板层,然后进行模板渲染,最后还是通过HttpResponse函数返回响应请求.
重定向.通过该函数可以指定要跳转的网页,可以通过该网页跳转到另一个网页,重定向一般是因为网页数据发生更改,或者网页不存在,需要跳转到新的页面,请求状态码一般为301和302,和render函数一样,最后还是需要通过HttpREsponse函数返回响应消息.
JsonResponse(向前端页面发送json格式的字符串)
dic={'name':'laq','age':18}
li=[1,2,3,4]
return HttpResponse(json.dumps(li))#介绍JsonResponse方法的原理,实际情况不用该方法
from django.http import JsonResponse
return JsonResponse(li,safe=False)#除字典以外的数据类型都需要把safe属性改成False才可以进行传输
FBV就是我们通常写的函数式的Django.
CBV是用来类来写Django.
CBV:
from django.views import View
class Test(View):
def dispatch(self,request,*args,**kwargs):#重构View中的dispatch方法,一般情况可以不用更改,View通过该方法判断请求是get还是post
#加点东西
obj=super().dispatch(request,*args,**kwargs)
return obj
def get(self.request):
obj=render(request,'index.html')
return obj
def post(self.request):
return HttpResponse('ok')
CSV中路由配置:re_path(r'index/',views.Test.as_view())
模板层代码:
<form action=""method="post"enctype="multipart/form-data">#enctype是选定文件编码的格式
username:<input type="text"name="name">
password:<input type="text"name="password">
file:<input type="file"name="myfile">
<input type="submit">
</form>
视图层代码:
file_obj=request.FILES.get('myfile')
file_name=file_obj.name
from django.core.filesuploadedfile import InMemoryUploadedFile
with open(file_name,'wb')as f:
for line in file_obj.chunks():#chunks()方法可以把下载的文件一点点读取存入,因为for只能循环可迭代对象,因此chunks()方法中用了一个生成器yield
f.write(line)
from django.urls import path
不支持正则,精准匹配
有5个普通转换器
int:匹配整型
str:匹配字符串
slug:匹配除/的字符
path:匹配路径,除了开头第一个?号都能匹配
uuid:匹配uuid格式
class Test:
regex='[0-9]{4}'
def to python(self,value):
#写一堆处理
value=value+'aaa'
return value
def to_url(self,value):
#用于反向解析
return'%04d'%value#%04d用于接受小于四位的数并拿0填充至四位
from django.urls import register_converter
register_converter(Test,'ttt')
path('index/<ttt:year>',views.index,name='index')
用法类似于url,可以使用正则,不多赘述
- 9/6-模板渲染
1.变量:句点符(.),深度查询(可以点到方法,不需要加括号,但该方法只能是无参函数),对列表、字典使用的时候相当于[].
2.过滤器:
1.date过滤器{{now(使用datetime模块获取的当前时间)|date:'Y-m-d H:i:s'}}
2.如果一个变量是false或者为空,使用给定的默认值,一般为空字符串,否则使用变量的值,例如,string=''
default过滤器{{string|default:'字符串没有值'}}#页面显示字符串没有值
3.返回值的长度,它对字符串和列表都有作用string='chenyoude'
length过滤器{{string|length}}
4.将至格式化为文件尺寸,例如num=1024*1024
filesizeformat过滤器{{num|filesizeformat}}
{{1024|filesizeformat}}
5.切片操作
slice过滤器{{'chenyoude'|slice:'1:9'}}
如果字符串字符多于指定的字符数量,那么会被截断,截断的字符串将以可以翻译的省略号序列('...')结尾
truncatechars过滤器{{'chenyoude'|truncatechars:5}}
truncatewords过滤器{{'chen you de|truncatewords:2}}
6.安全处理
safe过滤器:{{string|safe}}
可以在视图层处理相当于safe过滤器的作用
from django.utils.safestring import mark_safe
sting=mark safe(string)
7.相加过滤器(可以传两个参数)
add过滤器{{1|add:'1'}}#页面显示结果2
{%for i in l%}
{{forloop}}#forloop必须得在for循环中使用
{%empty%}#如果列表为空则输出该行
{%endfor%}
{%if条件%}#if语句支持and、or、==、>、<、!=、<=、>=、in、not in、is、is not判断.
{%endif%}
{%with dic=dic.name...%}#with一般用于dic.name...过长的时候用于重命名
#{%with dic.name...as dic%}该写法也是正确
{%endwith%}
xss攻击,跨站脚本攻击:即我们如果不对上传至数据库的数据进行处理,我们可以输入一个标签到数据库,然后数据库拿出数据对页面进行渲染,如果在页面渲染的时候对数据也不进行处理,这个时候我们输入的标签数据则会对页面进行渲染
1.先去setting里配置app
2.在app目录下创建一个templatetags模块
3.写py文件(my_test.py)
4.from django import template
5.register=template.Library()
6.写函数addstr(用requester.filter()装饰)#函数至少一个形参,最多一个形参,第一个形参一般用于使用该函数的值
7.模板:自行添加语句
6.{%load my_test%}#使用该行下载我们自定义的过滤器
9.{{'cyd'|addstr:'ishandsome'}}
1.先在settings里面配置app
2.在app目录下创建一个templatetags模块
3.写py文件(my_test.py)
4.from django import template
5.register=template.LIvrary()
6.写函数:
@register.simple_tag(name='yy')
def my_sum(x,y,z,i):
return x+y+z+i
7.模板:
8.{%load my_test%}
9.{%yy 1 2 3 4%}#以空格做分割,传参数