(一)数据分页 

可以参考  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">&laquo;首页 </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 }}">尾页 &raquo;</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跨站点请求伪造的更多相关文章

  1. Django框架(十七)—— 中间件、CSRF跨站请求伪造

    目录 中间件 一.什么是中间件 二.中间件的作用 三.中间件执行顺序 四.自定义中间件 1.导包 2.定义类,继承MiddlewareMixin 3.在视图函数中定义一个函数 4.在settings的 ...

  2. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  3. Django框架(十二)-- 中间件、CSRF跨站请求伪造

    中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...

  4. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  5. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  6. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  7. Django框架 之 基于Ajax中csrf跨站请求伪造

    Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: ...

  8. 十三 Django框架,CSRF跨站请求伪造

     全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...

  9. django上课笔记3-ORM补充-CSRF (跨站请求伪造)

    一.ORM补充 ORM操作三大难点: 正向操作反向操作连表 其它基本操作(包含F Q extra) 性能相关的操作 class UserInfo(models.Model): uid = models ...

随机推荐

  1. 下载一个新的app之后,如果分析、鉴赏?

    一直对新的事物还是比较好奇的,所以希望以后每隔几天就下载一个app,去体验,但是之前体验的时候,都是大概看看功能.竞品分析.流畅度等等,却没有一个完整的方法论,所以,这篇文章就是总结一下更为具体的方法 ...

  2. 用SpringSecurity从零搭建pc项目-02

    参照这一篇文章吧,比如你不需要做的那么通用,取其中一部分代码即可. https://www.cnblogs.com/lihaoyang/p/8491792.html

  3. 解决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 ...

  4. JavaScript -- URL编码

    ----- 010-escape.html ----- <!DOCTYPE html> <html> <head> <meta http-equiv=&quo ...

  5. 前端通信:ajax设计方案(五)--- 集成promise规范,更优雅的书写代码(改迭代已作废,移步迭代10)

    该迭代已作废,最新的请移步这里:https://www.cnblogs.com/GerryOfZhong/p/10726306.html 距离上一篇博客书写,又过去了大概几个月了,这段时间暂时离开了这 ...

  6. Chapter 3 Phenomenon——23

    Charlie put one arm behind my back, not quite touching me, and led me to the glass doors of the exit ...

  7. Tensorflow应用之LSTM

    学习RNN时原理理解起来不难,但是用TensorFlow去实现时被它各种数据的shape弄得晕头转向.现在就结合一个情感分析的案例来了解一下LSTM的操作流程. 一.深度学习在自然语言处理中的应用 自 ...

  8. Netty——高级内置解码器、编码器、ByteBuf

    netty通讯需要对数据进行编码,解码,于是我们需要用到netty的编码器.解码器   netty 提供的解码器 DelimiterBasedFrameDecoder 解决TCP的粘包解码器 Stri ...

  9. C# 1.0 到 4.0 的进化 1

    定义一个产品类 Product C# 1 using System; using System.Collections; namespace C1 { public class Product { s ...

  10. Tomcat学习总结(10)——Tomcat多实例冗余部署

    昨天在跟群友做技术交流的时候,了解到,有很多大公司都是采用了高可用的,分布式的,实例沉余1+台.但是在小公司的同学也很多,他们反映并不是所有公司都有那样的资源来供你调度.往往公司只会给你一台机器,因为 ...