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 ...
随机推荐
- 解决Redisson出现Failed to instantiate [org.redisson.api.RedissonClient]: Factory method 'create' threw exception; nested exception is java.lang.ArrayIndexOutOfBoundsException: 0的问题
一.背景 最近项目中使用了redisson的哨兵模式来作为redis操作的客户端,然后一个意外出现了,启动报:Failed to instantiate [org.redisson.api.Redis ...
- C#基础篇三流程控制1
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01R ...
- salesforce 零基础学习(七十)使用jquery tree实现树形结构模式
项目中UI需要用到树形结构显示内容,后来尽管不需要做了,不过还是自己做着玩玩,mark一下,免得以后项目中用到. 实现树形结构在此使用的是jquery的dynatree.js.关于dynatree的使 ...
- Web Components实践开发Tab组件
本文是对web components的一次实践,最终目的是做出一个tab组件,本文涉及Custom Elements(自定义元素).HTML Imports(HTML导入).HTML Template ...
- maven - 使用nexus 搭建maven私服
1, java环境 [wenbronk@localhost nexus]$ java -version java version "1.8.0_121" Java(TM) SE R ...
- 如何做实时监控?—— 参考 Spring Boot 实现(转)
转自:http://blog.csdn.net/xiaoyu411502/article/details/48129057 随着 微服务 的流行,相比较以前一个大型应用程序搞定所有需求,我们现在更倾向 ...
- 【杂谈】Java I/O的底层实现
前言 Java I/O功能封装的很好,使用起来很方便,就是刚开始学的时候,如果不了解装饰器模式,会被他繁多的类给吓到.用多了也就习惯了,而且现在有很多实用的封装良好的实用类,可直接读写整个文件.开发者 ...
- 微信小程序开发语言的选择
微信使用的开发语言和文件很「特殊」. 小程序所使用的程序文件类型大致分为以下几种: ①WXML(WeiXin Mark Language,微信标记语言) ②WXSS(WeiXin Style Shee ...
- [Golang] 第三方包应该如何安装--在线和离线
一 在线安装 采用go get的方式安装import 的时候找不到对应的包看看pkg里面有没有 二 离线安装 redis客户端采用git clone的方法安装的话可以用以下方法 cd src git ...
- layer插件学习——提示层
本文是自己整理的关于layer插件的提示层的结果 一.准备工作 下载jQuery插件和layer插件,并引入插件(注意:jQuery插件必须在layer插件之前引用) 百度云资源链接: jQuery插 ...