利用Python装饰器给Django做IP白名单
对于装饰器不太了解的可以百度谷歌查询,有蛮多博客写的很好
环境说明:
- 系统:Windows10
- 开发工具:Pycharm
- Python版本:3.5
1. 创建Django工程
查看之前教程或者百度查询,相关教程
2. 干货-核心代码
- 目录结构
- 添加验证码App,文件Demo/settings.py
ALLOWED_HOSTS = ["*"]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app.apps.AppConfig',
]
# 会影响post请求,这里可屏蔽可不屏蔽,我们用GET请求做测试
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
- 创建放工具类的文件夹和我们IP白名单的py文件utils\white_list.py,文件放置位看目录结构
from django.http import JsonResponse
?
?
def get_ip(request):
"""
获取请求IP地址
:param request:
:return:
"""
if request.META.get('HTTP_X_FORWARDED_FOR'):
ip = request.META.get("HTTP_X_FORWARDED_FOR")
else:
ip = request.META.get("REMOTE_ADDR")
return ip
?
?
def check_ip(func):
"""
校验IP白名单装饰器
:param func:
:return:
"""
?
def check(*args, **kwargs):
?
results = {
'status': 1,
'msg': '非法IP地址'
}
?
ip = get_ip(args[0].request)
?
# 这里IP白名单列表地址可以从Redis或者数据或者配置文件里面读取出来
# 做到界面配置是最好的,针对访问的接口进行IP限制
# 本地IP地址是127.0.0.1
if ip in ['127.0.0.1']:
return func(*args, **kwargs)
else:
return JsonResponse(results)
?
return check
?
- 添加路由,Demo\urls.py
from django.conf.urls import url
from django.contrib import admin
?
from app.views import TestApi
?
urlpatterns = [
?
url(r'^admin/', admin.site.urls),
# 添加测试接口
url(r'^test#39;, TestApi.as_view()),
]
- 添加视图代码Demo\view.py
from django.http import JsonResponse
from django.views import View
?
from utils.white_list import check_ip
# Create your views here.
from rest_framework.views import APIView
?
?
class TestApi(View):
?
@check_ip
def get(self, request):
results = {
'status': 0,
'msg': '成功'
}
return JsonResponse(results)
?
3. 测试
- Pycharm运行程序
- 浏览器输入http://127.0.0.1:8000/test
- 查看界面结果
- 修改装饰器里面的IP地址为127.0.0.2
- 重新启动,刷新浏览器