-- 限制访问次数作业解答  --
-- urls.py 里--
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),] -- views.py 里--
from django.shortcuts import render, HttpResponse
def index(request):
return HttpResponse('index') -- 代码写在哪里? 限制次数 --
新建文件夹 middleware --> my_middleware.py里
在 settings.py 里注册中间件 'middleware.my_middleware.Throttle'
导入类
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
import time visit_dict = {}
-- 普通版 --
class Throttle(MiddlewareMixin): 节流器
def process_request(self, request):
ip = request.META.get('REMOTE_ADDR')
now = time.time()
# 获取访问的记录
history = visit_dict.get(ip, [])
# 根据记录进行判断 [ 10:06:05,10:06:09,10:06:45 ]
new = []
for i in history:
if now - i < 5:
new.append(i)
history = new
if len(history) >= 3:
return HttpResponse('访问频率太快了,你先歇一会')
history.append(now)
visit_dict[ip] = history -- 优化版--
def process_request(self, request):
ip = request.META.get('REMOTE_ADDR')
now = time.time()
# 获取访问的记录
history = visit_dict.get(ip, [])
# 根据记录进行判断 [ 10:06:45,10:06:09,10:06:05, ]
while history and now - history[-1] > 5:
history.pop() #删除最后一个
if len(history) >= 3:
return HttpResponse('访问频率太快了,你先歇一会')
history.insert(0, now)
visit_dict[ip] = history
-- session 版 -- 一个浏览器就是一个用户
def process_request(self, request):
now = time.time() #拿到当前时间
# 获取访问的记录
history = request.session.get('history', [])
# 根据记录进行判断 [ 10:06:45,10:06:09,10:06:05, ]
while history and now - history[-1] > 5:
history.pop()
if len(history) >= 3:
return HttpResponse('访问频率太快了,你先歇一会')
history.insert(0, now)
request.session['history'] = history
数据库没表 python manage.py migrate 数据库迁移命令
django_session表 一个浏览器就是一个记录

-- html --  ajax参数的问题
$.ajax({
url: '/ajax_test/', 提交地址
type: 'get', 类型
data: { 数据
name: 'alex', 键值对
age: 73,
hobby: JSON.stringify(['大保健', 'cnb', '画大饼'])
},
success: function (res) { 回调函数
console.log(res)
},
error: function (res) { 错误
console.log(res)
}
}) -- views.py -- from django.conf import global_settings
import json
from django.http import JsonResponse def ajax_test(request): print(request.POST) hobby = request.POST.get('hobby') # 拿到字符串的东西
hobby = json.loads(hobby) # 反序列化
print(hobby, type(hobby)) # 列表 list # return HttpResponse(json.dumps({'xxx':'xxxx'})) # text/html; charset=utf-8
return JsonResponse({'xxx': 'xxxx'}) # content_type: application/json'
# return JsonResponse([],safe=False) # content_type: application/json'
复制代码

上传文件 upload

-- html --
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" enctype="multipart/form-data"></form>
**<form action="" enctype="application/x-www-form-urlencoded"></form>** 删除这行
<input type="file" id="f1">
<button id="b1">上传</button> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script>
$('#b1').click(function () {
var form_obj = new FormData(); #组建FormData对象
form_obj.append('x1', $('#f1')[0].files[0]); #jQuery对象到DOM对象--键,值
$.ajax({
url: '/upload/',
type: 'post',
data: form_obj,
processData:false, #注意 不处理编码方式
contentType:false, #注意 不处理请求头
success: function (res) {
alert('OK')
}
})
})
</script>
</body>
</html> -- views.py -- 此时注释csrf中间件
def upload(request):
if request.is_ajax(): #是的话就返回True
file_obj = request.FILES.get('x1')
with open(file_obj.name, 'wb') as f:
for i in file_obj.chunks():
f.write(i)
return HttpResponse('ok')
return render(request, 'upload.html')

csrf 校验

-- 发 ajax 能提交 post 请求 --
保证有cookie {% csrf_token %} 两个作用:一个是隐藏的标签,另一个检查里能看到cookie了
方法一:
$.ajax({
url: '/calc/',
type: 'post',
data: { csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() , #属性选择器
i1: $('[name="i1"]').val(),
i2: $('[name="i2"]').val(),
},
success: function (res) {
$('[name="i3"]').val(res)
}
})
方法二:
装饰器
from django.views.decorators.csrf import ensure_csrf_cookie #确保访问某个视图有csrf_cookie
@ensure_csrf_cookie
def func(request):
pass
设置请求头
$('#b2').click(function () {
$.ajax({
url: '/calc2/',
type: 'post',
headers:{
'X-csrftoken': $('[name="csrfmiddlewaretoken"]').val(),
},
data: {
i1: $('[name="ii1"]').val(),
i2: $('[name="ii2"]').val(),
},
success: function (res) {
$('[name="ii3"]').val(res)
}
})
});
推荐以后的用法 -- 引入静态文件,配置静态文件 --批量操作
static --> js -->ajax_setup.js
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
} #正则表达式 匹配
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
页面引用
<script src="/static/js/ajax_setup.js"></script>
这样每个ajax都可以发送post请求了

限制访问次数例子和Ajax的some的更多相关文章

  1. 利用 awk 统计nginx 中某一个用户的访问次数

    线上总是会遇到攻击,所以就需要分析 access.log 看看那些用户的访问次数不正常,针对这些不正常的用户,要做处理,以 access.log为例说明下怎么统计. 通过 access.log 日志来 ...

  2. php统计网站访问次数的一个简单方法

    这里主要用到了session保存当前访问者,并将访问次数写入本地文件. <? @session_start(); $counter = intval(file_get_contents(&quo ...

  3. Java web--Filter过滤器分IP统计访问次数

    分IP统计访问次数即网站统计每个IP地址访问本网站的次数. 分析 因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便. 因为需要分IP统计,所以可以在过滤器中创建 ...

  4. JSP+Servlet+JavaBean统计页面在线访问次数

    统计页面浏览次数:使用的是servlet实现统计次数传递给JSP页面 说明:我做的都比较接地气,意思就是比较简单! 效果图如下: 上代码 counter.java(它真的好简单,啥事不干,只是定义一个 ...

  5. Nginx限制某个IP同一时间段的访问次数

    nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数. HttpLimitReqModul用来限制连单位时间内连接数的模块, ...

  6. nginx日志中访问最多的100个ip及访问次数

    nginx日志中访问最多的100个ip及访问次数 awk '{print $1}' /opt/software/nginx/logs/access.log| sort | uniq -c | sort ...

  7. web api 限制单个IP在一定时间内访问次数

    ps:下面实例是每隔30秒访问次数不超过3次 1.Filter: using Infrastructure.Log; using Infrastructure.Web; using Lemon.Sta ...

  8. 学习笔记_过滤器应用_1(分ip统计网站的访问次数)

    分ip统计网站的访问次数 ip count 192.168.1.111 2 192.168.1.112 59 统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做 ...

  9. Java web 实现 之 Filter分析ip统计网站的访问次数

    统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的. 用什么东西来装载统计的数据.Map<String,Integer& ...

随机推荐

  1. android仿支付宝输入车牌号

    这个是iOS的效果图,差异不大,楼主主攻OC,见谅 需要用到的xml文件 需要用到的类 number_or_letters.xml <?xml version="1.0" e ...

  2. 20170725 Python 必须使用的Url编码

    -- 1 原因:在进行API 调用传参时,如果出现了和区分参数标识一样的特殊字符,那么就需要编码来作用 或者,传递的参数有敏感数据. 我的目的: Python开发的接口,C#调用传递参数 先用C# 进 ...

  3. Unity3D加密保护案例分享(一)

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎.通过u ...

  4. seller【2】Mock数据(接口访问配置)

    Mock数据 在文件[vue.config.js] - devServer 字段 - before(app)函数配置数据接口访问 const appData = require('./data.jso ...

  5. python连接redis

    一.首先,要下载redis pip3 install redis 二.连接redis import redis #拿到一个redis的链接 conn=redis.Redis('127.0.0.1',6 ...

  6. OpenVPN简介及架构详解

    OpenVPN简介 1 简介    VPN(Virtual Private Network)直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道. OpenVPN无疑是Linux ...

  7. [wx]雪落香杉树人物关系图

    雪落香杉树 开始的时候场面比较宏大,出场的人比较多.加上外国人名字没辨识度,所以容易乱 被告人: 宫本天道 9 10 11 12月被关77天(谋杀罪,9.16日早谋杀卡尔.海因)--妻子:初枝 白色衬 ...

  8. Day6 Python常用的模块

    一.logging模块 一.日志级别 critical=50 error=40 waring=30 info=20 debug=10 notset=0 二.默认的日志级别是waring(30),默认的 ...

  9. 超全PHP学习资源整理:入门到进阶系列

    PHP是少数几门在语言层面饱受诟病,但在实际开发和应用上却又让人无法撒手的语言之一.就好比路边摊小吃,一遍骂人家不卫生,一遍却又说:真香.所谓接地气,不外如此,大道理不说,PHP光是轮子多.市场占有率 ...

  10. [LeetCode] 240. Search a 2D Matrix II_Medium tag: Binary Search

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...