关于 WEB 前后端分离的要点总结(上)
Posted 51reboot运维开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 WEB 前后端分离的要点总结(上)相关的知识,希望对你有一定的参考价值。
接口格式
增、删、改、查及分页
跨域
ACL 访问控制
Token 认证
路由格式:
/api/<module>/
示例:
/api/assets/
/api/dns/
/api/monitor/
返回格式:
0表示请求成功, 非0表示请求异常
{u'message': u'ERROR_PROXY_AUTH_FAILED', u'code': -97}
{u'message': u'SUCCESS', u'code': 0}
采用 django-rest-framework 框架提供后端接口服务;
示例:
# -*- coding: UTF-8 -*-
class StandardResultsSetPagination(pagination.PageNumberPagination):
# 覆盖 settings 中的默认分页
page_size = 10
# page_size_query_param = 'page'
# 限制最大分页大小
max_page_size = 10
class BaseManageView(generics.ListAPIView):
serializer_class = TbRecordsSerializer
model = TbRecords
queryset = TbRecords.objects.all()
pagination_class = StandardResultsSetPagination
parser_classes = (JSONParser,)
def get_object(self, pk):
try:
return TbRecords.objects.get(pk=pk)
except TbRecords.DoesNotExist:
raise Http404
def get(self, request, *args, **kwargs):
# 分页
return super(DnsManageView, self).get(request, *args, **kwargs)
def get_queryset(self):
# 条件搜索
queryset = super(DnsManageView, self).get_queryset()
queryset = self.get_queryset_search(queryset)
return queryset
def get_queryset_search(self, queryset):
queryset = queryset.objects.filter(update_time=F('update_time') + 8)
return queryset
def post(self, request):
# 添加
data = self._parseRequest(request.body)
pass
return apiSucess("SUCCESS", 200)
def put(self, request):
# 修改
data = self._parseRequest(request.body)
pass
return apiSucess("SUCCESS", 200)
def delete(self, request, pk):
# 删除
obj = self.get_object(pk)
obj.delete()
return apiSucess("SUCCESS", 204)
def options(self, request):
# 非分页
data = TbRecords.objects.values()
return apiSucess(data, 200)
def _parseRequest(self, querydict_obj):
# 解析已提交的数据
params = QueryDict(querydict_obj).dict()
if isinstance(params, dict):
if len(params) == 1:
data = json.loads(params.keys()[0])
else:
data = params
elif isinstance(params, list):
pass
else:
pass
return data
1、通过 NGINX 的方式
通过在 nginx 代理添加 header 的方式
server {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
2、通过后端服务方式
修改 project_name/settings.py 文件.
(1) 添加.
INSTALLED_APPS 添加 corsheaders
(2) 开启黑白名单,任选其一。
CORS_ORIGIN_ALLOW_ALL = True CORS_ORIGIN_WHITELIST = ( '*', 'localhost:8000', '127.0.0.1:9000', )
针对主机的权限控制
示例:
# -*- coding: UTF-8 -*- import functools from rest_framework import status from rest_framework.response import Response # 允许的白名单IP地址 ALLECT_ADDR_POOL = ( '127.0.0.1', ) def AclHost(func): def wrapper(request, *args, **kwargs): username = request.request.user method = request.request.method if request.request.META.has_key('HTTP_X_FORWARDED_FOR'): remote_addr = request.request.META['HTTP_X_FORWARDED_FOR'] else: remote_addr = request.request.META['REMOTE_ADDR'] # 有多层代理 if remote_addr.count(',') >=1: remote_addr = remote_addr.split(',')[-1].strip() if remote_addr not in ALLECT_ADDR_POOL: data = {'result' : {'username' : username, 'method' : method, 'remote_addr' : remote_addr}, "errmsg" : 'FORBIDDEN'} return Response(data, status=status.HTTP_403_FORBIDDEN) return func(request, *args, **kwargs) return functools.wraps(func)(wrapper)
针对 Token 的权限控制
创建用户自动生成 Token,基于 Token 的路由的访问。
示例:
(1) djuser/models.py
# -*- coding: UTF-8 -*- from django.conf import settings from django.db.models.signals import post_save from django.dispatch import receiver from rest_framework.authtoken.models import Token from django.contrib.auth.models import User # 针对新创建的用户生成token @receiver(post_save, sender=User) def create_auth_token(sender, instance=None, created=False, **kwargs): if created: Token.objects.create(user=instance)
(2) djuser/views.py
from rest_framework.authentication import SessionAuthentication, BasicAuthentication, TokenAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView class UserManager(APIView): # Token验证 authentication_classes = (SessionAuthentication, TokenAuthentication) permission_classes = (IsAuthenticated,) def get(self, request, format=None): content = { 'user': unicode(request.user), # `django.contrib.auth.User` instance. 'auth': unicode(request.auth), # None } return Response(content)
完
Python 实战班第16期火热报名进行中
招生要求:
想往开发或者运维开发方向发展,Python 基础为零或薄弱,但能读懂 shell 或者其它任何一门语言的同学。
课程内容:
精简版 CMDB
1、html+css+js 多种前端技术结合
2、ajax 异步请求操作
3、分页搜索功能
4、常见数据库设计原则、CMDB 表结构实战、Mysql 实操
5、独立完项目、了解完整的 Web(LAMP) 架构
Nginx 日志统计分析与多维可视化
1、用 Python 处理 Nginx 日志文件,进行多维度数据统计分析
3、Highcharts 等流行前端技术多维度,将分析结果可视化展示
快速构建实用监控系统
1、Python 读取机器的实时使用数据,通过 Http 请求将数据入库
2、设计数据入库的 API,收集不同机器的数据
3、前端将内存数据读出,视化展示折线图
4、独立完成项目,掌握 Python 常用的 time 等模块
咨询报名联系:
QQ(1):979950755 小月
QQ(2):279312229 ada
WeChat : 1902433859 小月
WeChat : 1251743084 小单
开课时间:9月2日
课程大纲:http://51reboot.com/course/actual/
(阅读原文,即可跳转)
以上是关于关于 WEB 前后端分离的要点总结(上)的主要内容,如果未能解决你的问题,请参考以下文章