小于号< 转换为<
大于号> 转换为>
单引号’ 转换为’
双引号" 转换为 "
与符号& 转换为 &
要关闭模板上下文字符串的转义:可以使用
{{ 模板变量|safe}}
也可以使用:
{% autoescape off %}
模板语言代码
{% endautoescape %}
模板硬编码中的字符串默认不会经过转义,如果需要转义,那需要手动进行转义。
safe和autoescape的区别在于,safe只能转义一个模板变量,而autoescape可以转义多个变量;
html转义示例
html_escape.html
html转义结果:
{{ content }}
使用safe过滤器关闭转义结果:
{{ content|safe }}
使用autoescape关闭转义结果:
{% autoescape off %}
{{ content }}
{{ content }}
{% endautoescape %}
模板硬编码中的字符串默认不会转义,即会经过html渲染:
{{ test|default:‘
hello
’ }}手动对硬编码进行转义:
{{ test|default:‘<h1>hello</h1>’ }}
配套函数
/html_escape
def html_escape(request):
“”“模板转义”“”
return render(request, ‘booktest/html_escape.html’, {‘content’: ‘
hello
’})验证码
在用户注册、登录页面,为了防止暴力请求,可以加入验证码功能,
如果验证码错误,则不需要继续处理,可以减轻业务服务器、数据库服务器的压力。
自实现验证码
安装pillow
pip install Pillow==3.4.1
编写函数/视图
from PIL import Image, ImageDraw, ImageFont
from django.utils.six import BytesIO
def verify_code(request):
引入随机函数模块
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))]
构造字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”
font = ImageFont.truetype(‘FreeMono.ttf’, 23)
构造字体颜色
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
存入session,用于做进一步验证
request.session[‘verifycode’] = rand_str
内存文件操作
buf = BytesIO()
将图片保存在内存中,文件类型为png
im.save(buf, ‘png’)
将内存中的图片数据返回给客户端,MIME类型为图片png
return HttpResponse(buf.getvalue(), ‘image/png’)
自实现验证码函数
查看验证码
url(r’^verify_code/$', views.verify_code),
在网页中使用验证码
{% csrf_token %}
用户:
密码:
记住用户名
html中使用验证码
登录校验验证码函数
def login_check(request):
1.获取用户名和密码
username = request.POST.get(“username”)
password = request.POST.get(“password”)
remember = request.POST.get(“remember”)
print(username, password)
获取用户输入的验证码
vcode1 = request.POST.get(‘vcode’)
获取session中保存的验证码
vcode2 = request.session.get(‘verifycode’)
进行验证码校验
if vcode1 != vcode2:
验证码错误
return redirect(‘/login’)
2.进行校验
3.返回应答
if username == “yifchan” and password == “yifchan”:
response = redirect(“/index”)
response = redirect(“/change_pwd”)
判断是否需要记住用户名
if remember == ‘on’:
设置cookie username-过期时间为1周
response.set_cookie(‘username’, username, max_age=7 * 24 * 3600)
记住用户登录状态
只有session中有islogin,就认为用户已经登录
request.session[‘islogin’] = True
request.session[‘username’] = username
return response
else:
return HttpResponse(“账号或密码错误”)
验证码校验函数
url反向解析
当某一个url配置的地址发生变化时,页面上使用反向解析生成地址的位置不需要发生变化。
根据url 正则表达式的配置动态的生成url。
在项目urls中包含具体应用的urls文件时指定namespace;
urlpatterns = [
url(r’^admin/', admin.site.urls),
url(r’^', include(‘booktest.urls’, namespace=‘booktest’)),
]
在应用的urls中配置是指定name;
urlpatterns = [
url(r’^index/$', views.index, name=‘index’),
url(r’^url_reverse/$', views.url_reverse), #
url(r’^show_args/(\d+)/(\d+)$', views.show_args, name=‘show_args’), # 捕获位置参数
url(r’^show_kwargs/(?P\d+)/(?P\d+)$', views.show_kwargs, name=‘show_kwargs’), # 捕获关键字参数
]
在模板文件中使用时,格式如下:
{% url ‘namespace名字:name’ %} 例如{% url ‘booktest:fan2’ %}
带位置参数:
{% url ‘namespace名字:name’ 参数 %} 例如{% url ‘booktest:fan2’ 1 %}
带关键字参数:
{% url ‘namespace名字:name’ 关键字参数 %} 例如{% url ‘booktest:fan2’ id=1 %}
在视图中/重定向的时候使用反向解析:
from django.core.urlresolvers import reverse
无参数:
reverse(‘namespace名字:name名字’)
如果有位置参数
reverse(‘namespace名字:name名字’, args = 位置参数元组)
如果有关键字参数
reverse(‘namespace名字:name名字’, kwargs=字典)
url反向解析示例
项目下的url文件
urlpatterns = [
url(r’^admin/', admin.site.urls),
url(r’^', include(‘booktest.urls’, namespace=‘booktest’)),
]
应用下的url文件
urlpatterns = [
url(r’^index/$', views.index, name=‘index’),
url(r’^url_reverse/$', views.url_reverse), #
url(r’^show_args/(\d+)/(\d+)$', views.show_args, name=‘show_args’), # 捕获位置参数
url(r’^show_kwargs/(?P\d+)/(?P\d+)$', views.show_kwargs, name=‘show_kwargs’), # 捕获关键字参数
url(r’^test_reverse/$', views.test_reverse, name=‘test_reverse’), # 视图使用反向解析
]
模板中使用url反向解析
配套函数
def url_reverse(request):
return render(request, ‘booktest/url_reverse.html’)
def show_args(request, a, b):
return HttpResponse(a+‘:’+b)
def show_kwargs(request, c, d):
return HttpResponse(c+‘:’+d)
url_reverse.html
index链接:
url反向解析生成index链接:
位置参数 /show_args/1/2:
动态生成/show_args/1/2:
关键字参数 /show_kwargs/3/4:
动态生成/show_kwargs/3/4:
视图中使用反向解析
反向解析函数
from django.core.urlresolvers import reverse
url: /test_reverse
def test_reverse(request):
重定向到 /index
return redirect(‘/index’)
url = reverse(‘booktest:index’)
重定向到位置参数 show_args/1/2
url = reverse(‘booktest:show_args’, args=(1, 2))
重定向到关键字参数 show_kwargs/3/4
url = reverse(‘booktest:show_kwargs’, kwargs={‘c’: 3, ‘d’: 4})
return redirect(url)
csrf攻击
首先做一个登录页,让用户输入用户名和密码进行登录,登录成功之后跳转的修改密码页面。在修改密码页面输入新密码,点击确认按钮完成密码修改。
登录页需要一个模板文件login.html.修改密码页面也需要一个模板文件change_pwd.html.
显示登录页的视图login,验证登录的视图login_check,显示发帖页的视图change_pwd,处理修改密码的视图change_pwd_action.
加功能:
a)只有用户登录之后才可以进行修改密码操作。
登录装饰器函数。
def login_required(view_func):
“”“登录判断装饰器”“”
def wrapper(request, *args, **kwargs):
判断用户是否登录
if request.session.has_key(‘islogin’):
已经登录了,就返回到函数
return view_func(request, *args, **kwargs)
else:
未登录,返回到登录页面
return redirect(‘/login’)
return wrapper
案例流程图:
django防止csrf的方式:
-
- 默认打开csrf中间件。
-
- 表单post提交数据时加上{% csrf_token %}标签。
防御原理:
-
1)渲染模板文件时在页面生成一个名字叫做csrfmiddlewaretoken的隐藏域。
-
2)服务器交给浏览器保存一个名字为csrftoken的cookie信息。
-
3)提交表单时,两个值都会发给服务器,服务器进行比对,如果一样,则csrf验证通过,否则失败。
登录案例代码
设计路由
url(r’^login/$', views.login), # 返回登录页面
url(r’^login_check/$', views.login_check), # 进行登录校验
url(r’^change_pwd/$', views.change_pwd), # 返回修改密码页面
url(r’^change_pwd_action/$', views.change_pwd_action), # 修改密码处理函数
编写login.html页面
记住用户名
login.html
编写login函数
def login(request):
“”“登录处理函数”“”
判断用户是否登录
if request.session.has_key(‘islogin’):
return redirect(‘/index’)
return redirect(‘/change_pwd’)
else:
获取cookie username
if ‘username’ in request.COOKIES:
username = request.COOKIES[‘username’]
else:
username = ‘’
return render(request, “booktest/login.html”, {‘usernam’: username})
login函数
编写
def login_check(request):
1.获取用户名和密码
username = request.POST.get(“username”)
password = request.POST.get(“password”)
remember = request.POST.get(“remember”)
print(username, password)
2.进行校验
3.返回应答
if username == “yifchan” and password == “yifchan”:
response = redirect(“/index”)
response = redirect(“/change_pwd”)
判断是否需要记住用户名
if remember == ‘on’:
设置cookie username-过期时间为1周
response.set_cookie(‘username’, username, max_age=7243600)
记住用户登录状态
只有session中有islogin,就认为用户已经登录
request.session[‘islogin’] = True
request.session[‘username’] = username
return response
else:
return HttpResponse(“账号或密码错误”)
login_check函数
编写change_pwd.html页面
新密码:
change_pwd.html
编写登录判断装饰器
def login_required(view_func):
“”“登录判断装饰器”“”
def wrapper(request, *args, **kwargs):
判断用户是否登录
if request.session.has_key(‘islogin’):
已经登录了,就返回到函数
return view_func(request, *args, **kwargs)
else:
未登录,返回到登录页面
return redirect(‘/login’)
return wrapper
登录判断装饰器
定义change_pwd函数
@login_required
def change_pwd(request):
“”“显示修改密码页面”“”
return render(request, ‘booktest/change_pwd.html’)
定义change_pwd_action函数
@login_required
def change_pwd_action(request):
“”“模拟修改密码处理”“”
1.获取新密码
pwd = request.POST.get(“pwd”)
username = request.COOKIES[‘username’]
username = request.session.get(‘username’)
2.实际开发的时候,修改对应的数据库中的数据
3.返回应答
return HttpResponse(‘%s修改密码为:%s’ % (username, pwd))
change_pwd_action函数
csrf伪造
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。
分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
(https://i-blog.csdnimg.cn/blog_migrate/ad7909a4730b780656545eb9552a5320.png)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-QWpQYbcS-1712160451178)]
现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。
分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算