Python Django框架笔记(四):数据分页和CSRF跨站点请求伪造
(一)数据分页
可以参考 https://docs.djangoproject.com/en/2.0/topics/pagination/

模板:如果只要显示 1、2、3、4、5、6.。。。的话,在模板中加上 第8、9、10行就行了
<span class="step-links">
{# 如果有上一页,返回true #}
{% if posts.has_previous %}
<a href="?page=1">«首页 </a>
<a href="/blog/?page={{ posts.previous_page_number }}">上一页</a>
{% endif %}</span>
{# posts.paginator.page_range 返回页码可迭代范围 ,例如有5页,这时候和range(1,5)是一样的。[1,2,3,4] #}
{% for post_num in posts.paginator.page_range %}
<a href="/blog/?page={{ post_num }}">{{ post_num }}</a>
{% endfor %}
<span class="current">
{# 如果有下一页,返回true#}
{% if posts.has_next %}
<a href="/blog/?page={{ posts.next_page_number }}">下一页</a>
<a href="/blog/?page={{ posts.paginator.num_pages }}">尾页 »</a>
{% endif %}
</span>
<span class="current">
Page {{ posts.number }} of {{ posts.paginator.num_pages }}
</span>
视图函数(views.py):
from blog.models import BlogPost
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger #获取博客信息并渲染到页面上
def archive(request):
#获取 BlogPost的所有数据并按timestamp倒序排序,timestamp相同则根据title排序
all_posts = BlogPost.objects.all().order_by('-timestamp','title')
#实例化Paginator,限制每页显示10条数据
paginator = Paginator(all_posts, 10)
#获取用户选择的页码
page = request.GET.get('page')
try:
posts = paginator.page(page)#获取page页的数据
except PageNotAnInteger:#页码不为整数则获取第一页数据
posts = paginator.page(1)
except EmptyPage:#超出最大页码则获取最后一页的数据
posts = paginator.page(paginator.num_pages)
#return render_to_response('archive.html', {'posts': posts,'form':BlogPostForm},RequestContext(request))
return render(request,'archive.html',{'posts': posts,})
(二)跨站点请求伪造(Cross-Site Request Forgery,CSRF)
不允许POST、PUT和DELATE等不安全的请求方式通过跨站点请求伪造来进行攻击。可以参考https://docs.djangoproject.com/en/2.0/ref/csrf/
1、项目文件下的settings.py 的MIDDLEWARE 列表的'django.middleware.csrf.CsrfViewMiddleware', 没有被注释 (django 2.0.5是默认启用的)
2、模板文件的<form>标签后面增加{% csrf_token %},例如:第一行最后面的那个就是了
<form action="/blog/create/" method="post">{% csrf_token %}
<table>{{ form }}</table><br>
<input type=submit>
</form>
3、请求类型修改为 RequestContext
from django.shortcuts import render,render_to_response
from blog.models import BlogPost,BlogPostForm
from django.template import RequestContext #获取博客信息并渲染到页面上
def archive(request):
posts = BlogPost.objects.all().order_by('-timestamp','title')
return render_to_response('archive.html', {'posts': posts,'form':BlogPostForm},RequestContext(request))
django 文档说明的一种方式应该就是上面这种写法render_to_response('archive.html', {'posts': posts,'form':BlogPostForm},RequestContext(request)),不过我试了下是没什么用,后面换render函数可以了(render函数请求类型就是RequestContext ,所以不用另外指定了)
from django.shortcuts import render
from blog.models import BlogPost,BlogPostForm #获取博客信息并渲染到页面上
def archive(request):
posts = BlogPost.objects.all().order_by('-timestamp','title')
return render(request,'archive.html',{'posts': posts,'form':BlogPostForm})
Python Django框架笔记(四):数据分页和CSRF跨站点请求伪造的更多相关文章
- Django框架(十七)—— 中间件、CSRF跨站请求伪造
目录 中间件 一.什么是中间件 二.中间件的作用 三.中间件执行顺序 四.自定义中间件 1.导包 2.定义类,继承MiddlewareMixin 3.在视图函数中定义一个函数 4.在settings的 ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
- Django框架(十二)-- 中间件、CSRF跨站请求伪造
中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)
Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造) 摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...
- Django框架 之 基于Ajax中csrf跨站请求伪造
Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({ data: {csrfmiddlewaretoken: ...
- 十三 Django框架,CSRF跨站请求伪造
全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...
- django上课笔记3-ORM补充-CSRF (跨站请求伪造)
一.ORM补充 ORM操作三大难点: 正向操作反向操作连表 其它基本操作(包含F Q extra) 性能相关的操作 class UserInfo(models.Model): uid = models ...
随机推荐
- (转)python的ConfigParser模块
原文:https://blog.csdn.net/miner_k/article/details/77857292 如何使用Python3读写INI配置文件-------https://blog.cs ...
- electron打包成桌面应用程序的详细介绍
1.前提条件 a. 安装了node b.安装了electron c.你知道自己写的东西(js,css,html等等)放在那个文件夹(假设这个文件夹命名为 app,下面会用到)中 2.安装electro ...
- 七、Framework类库
1.Framework类库简介 .Net Framework类库包含Framework类库(Framework Class Library,FCL).FCL是一组DLL程序集的统称,其中含有数千个类型 ...
- 小程序/js监听输入框验证金额
refundAmoutInput: function(event){ var value = event.detail.value; if (value.split('.')[0].length &g ...
- jQuery ajax请求错误返回status 0和错误error的问题
上周发现一个jQuery ajax请求错误返回status 0和错误error的问题,responseText是"error",状态码是0而不是200: $.ajax({ type ...
- Intent的那些事儿
请原谅我用这么文艺的标题来阐释一颗无时无刻奔腾着的2B青年的心.可是今天要介绍的Intent绝不2B,甚至在我看来,或许还有些许飘逸的味道,至于飘逸在哪里呢?那我们就好好来剖析剖析Intent和它的好 ...
- springboot 多模块 -- 将 dao(mybatis) 拆分出去
前言: 以前我们在建项目的时候, 要么将所有的package建在一个项目里面, 在处理引用的时候, 真的很方便. 不用担心, 有些东西配置不到或者读取不到. 或者, 将package独立出去, 到一个 ...
- Tomcat中配置Url直接访问本地其他磁盘
在配置 Tomcat serserver.xml 中配置 <Context path="/image" docBase="E:\image" debug= ...
- windows10 设置软件开机启动
在 C:\Users\your_name\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 在这个目录下,新建你想开机启动的软 ...
- C#中将String类型保存到本地文件的方法
今天刚刚遇到,要在WinForm中把一个xml保存到本地, 由于之前是学习java的,一时间还真不知道怎么写, 没想到C#居然那么方便,就3句代码就实现了我要的功能: StreamWriter sw ...