中间件的使用
限制同一IP访问次数

1.获取远程客户端的IP地址

request.META[‘REMOTE_ADDR’]

2.得到客户端访问的请求路由信息

request.path_info

创建一个中间件

class VisitLimit(MiddlewareMixin):visit_times = {}def process_request(self, request):# 应该在执行路由之前就要调用,确保其IP的访问次数未超标ip_address = request.META['REMOTE_ADDR']# 湖区I{path_url = request.path_info# 获取访问的URLif not re.match('^/text', path_url):# 判断URL是否为/text开头,若不是,就返回None,继续执行请求returntimes = self.visit_times.get(ip_address, 0)# 计算访问次数,在字典中存储其访问次数print('ip' + str(ip_address) + '已经访问了' + str(times))if times > 5:# 当请求次数大于5时,就禁止访问了,直接返回一个HttpResponse对象,无法继续正常的请求return HttpResponse("当前{}已经访问了".format(ip_address) + str(self.visit_times[ip_address]) + '次,已经禁止访问了')self.visit_times[ip_address] = times + 1# 访问了一次就进行加1

csrf恶意攻击
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
 CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。


如何避免
1.在settings中将中间件中的django.middleware.csrf.CsrfViewMiddleware打开
2.然后再页面的源代码中的form表单中添加{% csrf_token %},即可
将中间件打开,向路由发送post请求就会报403错误

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>测试</title>
</head>
<body>
<form action="/text_csrf" method="POST">{%  csrf_token %}<input type="text" name="username"><input type="submit" value="提交">
</form></body>
</html>

加上{% csrf_token %}后就可以访问了,其要加载form表单中
使用了csrf检查就会在生成cookies时生成一个

这样就应对了不同网页只能或密码2的恶意请求

如果想一些url访问时不要被csrf检查,也可以在不更改网页源代码的基础上,在视图函数中进行包的使用

from django.views.decorators.csrf import csrf_exempt@csrf_exempt # 加上过滤器即可,使用前要导入相应的包
def my_views(request):return render(request,'my_views.html')

分页
web在有很多数据时,一张页面无法显示全部的数据,将数据分到不同的页面当中去。这样有减少了数据提取量,降低了服务器的压力,且易于阅读。
Django提供了Paginator类可以方便实现分页的功能
Paginator类位于django.core.paginator模块中

Paginator对象
负责分页数据整体的管理
对象的构造方法

paginator = Paginator(object_list,per_page)
object_list:需要分页数据的对象列表
per_page:每一页显示的数据的个数
返回值:Paginator对象

Paginator属性

count:需要分页的对象的总数
num_pages:分页后的页面总数
page_range:从1开始的range对象。用于记录当前页码数
per_page:每页数据的个数

Paginator方法

.page(number):

参数:number为页码信息
返回当前number页对应的页信息
如果当前number页码不存在,抛出InvalidPage异常


InvalidPage异常:

-PageNotAnInterger:当向page中传入的数据不是一个整数值的时候就抛出
-EmptyPage:当向page提供的值,该页面没有任何对象时抛出

Page对象方法

has_ next(): 如果有下一页返回True
has_ previous(): 如果有.上一页返回True
has_ other_pages():如果有上一页或下一页返回True
next_ page_ number(): 返回下一页的页码,如果下一页不存在,拋出InvalidPage异常
previous_ page_ number():返回上一页的页码,如果. 上一页不存在抛出 InvalidPage异常

def text_page(request):page_number = request.GET.get('page',1)all_data =  ['a','b','c','d','e']paginator = Paginator(all_data,2)c_page = paginator.page(int(page_number))return render(request,'text_page.html',locals())
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>分页</title>
</head>
<body>{%  for p in c_page %}
<p>{{ p }}
</p>
{%  endfor %}
{% if c_page.has_previous %}<a href="/text_page?page={{ c_page.previous_page_number }}">上一页</a>
{% else %}上一页
{% endif %}
{% for p_num in paginator.page_range %}{%  if p_num == c_page.number %}{{ p_num }}{% else %}<a href="/text_page?page={{ p_num }}">{{ p_num }}</a>{% endif %}
{%  endfor %}{% if  c_page.has_next %}<a href="/text_page?page={{ c_page.next_page_number }}">下一页</a>
{% else %}下一页
{% endif %}</body>
</html>


CSV文件下载
在网页中可以下载csv文件

def make_csv(request):response = HttpResponse(content_type='text/csv') # 初始化HttpResponse对象时可以传递参数,更改请求头,设置为text/csvresponse['Content-Disposition'] = 'attachment;filename="book.csv"'# 设置请求头中的Content-Disposition为attachment;filename为指定的文件名all_book = Book.objects.all()# 获取数据库中的所有书籍writer = csv.writer(response)# 可以直接将response创建为csv写入对象writer.writerow(['id','title'])# 第一行写入标题for b in all_book:writer.writerow([b.id,b.title])# 接下来每一行写入对应书籍的信息return response

配置路由后访问页面就会弹出一个另存为页面框,点击另存为就可以将文件进行下载
下载之后就是数据库中各条数据
将数据库导入到页面中,并提供下载的超链接

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>分页</title>
</head>
<body>{%  for p in c_page %}
<p>{{ p.id }}.{{ p.title }}
</p>
{%  endfor %}
{% if c_page.has_previous %}<a href="text_page?page={{ c_page.previous_page_number }}">上一页</a>
{% else %}上一页
{% endif %}{% for p_num in paginator.page_range %}
{%  if p_num == c_page.number %}{{ p_num }}
{% else %}
<a href="text_page?page={{ p_num }}">{{ p_num }}</a>
{% endif %}
{%  endfor %}{% if  c_page.has_next %}<a href="text_page?page={{ c_page.next_page_number }}">下一页</a>
{% else %}下一页
{% endif %}
<p><a href="make_page_csv?page={{ page_number }}">下载csv</a>
</p></body>
</html>
def text_page(request):page_number = request.GET.get('page', 1)all_data = Book.objects.all()paginator = Paginator(all_data, 2)c_page = paginator.page(int(page_number))return render(request, 'make_page_csv.html', locals())def make_page_csv(request):page_number = request.GET.get('page', 1)all_data = Book.objects.all()paginator = Paginator(all_data, 2)c_page = paginator.page(int(page_number))response = HttpResponse(content_type='text/csv')response['Content-Disposition'] = 'attachment;filename="{}.csv"'.format(page_number)write = csv.writer(response)write.writerow(['id', 'title'])for i in c_page:write.writerow([i.id, i.title])return response


内建用户系统
数据库中含有用户的表auth_user,存储的就是用户的信息
基本字段
模型类位置
from django.contrib.auth,models import User

username,password,email,first_name,last_name
is_superuser:是否为账号管理员
is_staff:是否可用访问admin管理界面
is_active:是否是活跃用户,默认为True,一般不删除用户,而是将
is_active设置为False
last_login:上一次登录时间 date_joined:用户创建时间

创建普通用户

from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱'...)

创建超级用户

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱'...)

删除用户

from django.contrib.auth,models import User
try:user = User.objects.get(username='用户名')user.is_active = Falseuser.save()
except:print('ERROR')

修改密码

from django.contrib.auth.models import User
try:user = User.objects.get(username='用户名')user.set_password('...')# 密码会转成hash值user.save()
except:print("ERROR")

校验密码

from django.contrib.auth import authenticate
user  = authenticate(username=username,password=password)
# 用户名密码校验正确返回user对象,否则返回None

保持登录状态

from django.contrib.auth import logindef login_view(request):user = authenticate(username=username,password=password)#确保用户名和密码的正确login(request,user)from django.contrib.auth.decorators improt login_required
@login_required
def index_view(request):
#该视图庇护为用户登录状态下才可以访问
#当前登录用户可通过request.user获取
login_user = request.user
...

登录状态的取消

from django.contrib.auth import logout
def logout_view(request):logout(request)

基本字段不够用?创建自定义字段
继承内建的抽象user模型类
步骤:
1.添加新应用
2.定义模型类,继承AbstractUser
3.settings.py中知名AUTH——USER_MODEL = ‘应用名.类名’
此操作要在第一次migrate之前进行
如下应用

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):# 以前是继承models.Modelphone = models.CharField('电话',max_length=30)

在settings文件中添加AUTH_USER_MODEL = 'BOOK.User'变量
这样在创建变量的时候就可以自己定义的字段了

文件上传
前端[HTML]
以POST方式提交,表单form中文件上传是必须带有ebctype='mulripart/form-data’是才会包含文件内容数据
表单中用<input type="file" name='xxx'>标签上传文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>上传文件</title>
</head>
<body>
<form action="text_upload" enctype="multipart/form-data" method="post">请输入要上传的文件的名称<input type="text" name="title"><input type="file" name="jpg"><input type="submit" value="上传">
</form></body>
</html>

后端
在视图函数中用request.FILES取文件框中的内容
file = request.FILES[‘xxx’]
说明:

1.FILES的key对应页面中fuke框的neame值
2.file是绑定文件流对象
3.file.name 文件名
4.file.file 文件的字节流数据

配置文件的访问路径和存储路径
在setting中在MEDIA相关配置;Django把用户上传的文件统称为media资源

MEDIA_URL = '/media/'# 表示什么样的请求是加载上传文件的请求
MEDIA_ROOT = os.path.join(BASE_DIR,'media')# 上传文件的保存路径

然后再项目的子文件夹中创建一个名叫media的文件夹
MEDIA_URL
MEDIA_ROOT 两者需要手动绑定
步骤:

...
from django.conf import settings
from django.conf.urls.static import static
...
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

将文件上传到本地

重写写一个模型

class Content(models.Model):title = models.CharField('文章标题', max_length=30)picture = models.FileField(upload_to='picture')  # 将文件生成到Midea文件夹下的picture子文件夹中
def text_upload(request):if request.method == "GET":return render(request, 'text_upload.html')elif request.method == "POST":title = request.POST['title']file = request.FILES['jpg']Content.objects.create(title=title,picture=file)return HttpResponse('上传文件成功')

在网页中上传文件之后,就会在midea文件夹中存在一个picture的子文件夹,里面存放的就是我们刚刚上传的文件


就可以根据之前在setting中设置的网址来访问保存的图片

限制同一IP访问次数,csrf,分页,Paginator,内建用户系统,文件上传,上传到本地相关推荐

  1. linux日志生成速率统计,Linux学习29-awk提取log日志信息,统计日志里面ip访问次数排序...

    前言 有一段log日志,需从日志里面分析,统计IP访问次数排序前10名,查看是否有异常攻击. 日志提取 如下日志,这段日志包含的信息内容较多,我们希望提取ip,访问时间,请求方式,访问路径(不带参数) ...

  2. 用户IP访问次数统计

    技术源于生活,服务生活 线上地址:https://api.imibi.cn Redis存储 1.使用Redis的0号数据库,数据格式是hash. import redis con = redis.Re ...

  3. python读取日志统计ip_使用python脚本实现统计日志文件中的ip访问次数

    使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...

  4. php限制ip访问次数 并发_[转]nginx限制某个IP同一时间段的访问次数

    如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候.其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见 ...

  5. 统计日志中ip访问次数并排序的三种方法

    1  利用linux中的awk命令 grep "GET aaa.log | awk -F " " '{print $NF}' >d:/test.log 假设日志的最 ...

  6. linux 访问日志ip排序,Linux通过日志文件统计IP访问次数排序

    假设我的日志文件内容如下: 218.92.217.53 - - [22/Nov/2017:17:26:27 +0800] "GET /images/rand HTTP/1.0" 2 ...

  7. ip访问次数统计 nginx_Linux分析Nginx日志统计IP访问次数的shell脚本

    平时运维遇到最多的就是nginx的日志分析了,要时常做系统监控,检查IP的访问次数是否有异常,防止恶意访问. 假设我的nginx日志如下: ....... 211.253.43.23 - - [03/ ...

  8. ip访问次数统计 nginx_PHP实现IP访问限制及提交次数的方法详解

    一.原理 提交次数是肯定要往数据库里写次数这个数据的,比如用户登陆,当用户出错时就忘数据库写入出错次数1,并且出错时间,再出错写2,当满比如5次时提示不允许再登陆,请明天再试,然后用DateDiff计 ...

  9. php限制ip访问次数 并发_PHP实现redis限制单ip、单用户的访问次数功能示例

    本文实例讲述了PHP实现redis限制单ip.单用户的访问次数功能.分享给大家供大家参考,具体如下: 有时候我们需要限制一个api或页面访问的频率,例如单ip或单用户一分钟之内只能访问多少次 类似于这 ...

最新文章

  1. 【 C 】最容易误判的优先级问题
  2. 图解动软代码生成器使用
  3. Jupyter notebook与Spyder,以及Jupyter notebook与Spyder集成插件
  4. 计算机科学与技术专业导论_教育部最新公布!西安工业大学新增4个本科专业!...
  5. C#LeetCode刷题,走进Google,走近人生
  6. [ActionScript 3.0] AS3.0 对象在一定范围随机显示不重叠
  7. Word邮件合并制作上百份薪酬变动通知书及日期格式处理技巧
  8. android迷宫源代码,迷宫 c++源代码(Maze c++ source code).doc
  9. 【转】人不成熟的几大特征——海尔集团CEO张瑞敏演讲稿
  10. 一文详解bundle adjustment
  11. TP99 TP999
  12. 罗振宇跨年演讲:哪来直接登顶的人生,只有不断迭代的历程
  13. 学猫叫用计算机歌词,抖音学猫叫是什么歌 学猫叫歌曲歌词
  14. R语言:R2OpenBUGS
  15. 使用HTML+CSS实现网页loading加载效果,支持定时或加载完成后隐藏
  16. Joint Extraction of Retinal Vessels and Centerlines Based on Deep Semantics and Multi-Scaled Cross-T
  17. 一个触发器有多少个稳态呢,触发器分类有什么
  18. school 靶机 wp
  19. 微波射频网在世界电信日 成功召开4G手机射频技术研讨会
  20. java实现星级评分功能_JS实现星星评分功能实例代码(两种方法)

热门文章

  1. 【转】 三十种饼的做法
  2. python汉诺塔递归算法流程图_详解汉诺塔Python递归程序
  3. Android桌面插件开发笔记
  4. 为JSON 数据加入斜杠 \
  5. 操作国学公众号项目,半年涨粉30万
  6. 项目日志20190705
  7. 使用Django构建个人网站(三)——模板套用
  8. 年入15万美元,每天4点下班:终身教职是我想要的生活吗?
  9. Vm虚拟机安装Ubuntu和VmTools
  10. 维护 世界服务器无法连接,魔兽世界怀旧服世界服务器无法连接问题解决方案...