关于 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', )
ACL 访问控制

针对主机的权限控制

示例:

# -*- 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,基于 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. 1、html+css+js 多种前端技术结合


  2. 2、ajax 异步请求操作


  3. 3、分页搜索功能


  4. 4、常见数据库设计原则、CMDB 表结构实战、Mysql 实操

  5. 5、独立完项目、了解完整的 Web(LAMP) 架构


Nginx 日志统计分析与多维可视化


  1. 1、Python 处理 Nginx 日志文件,进行多维度数据统计分析


  2. 3、Highcharts 等流行前端技术多维度,将分析结果可视化展示


快速构建实用监控系统


  1. 1、Python 读取机器的实时使用数据,通过 Http 请求将数据入库


  2. 2、设计数据入库的 API,收集不同机器的数据


  3. 3、前端将内存数据读出,视化展示折线图


  4. 4、独立完成项目,掌握 Python 常用的 time 等模块


咨询报名联系:

QQ(1):979950755    小月   

QQ(2):279312229    ada   

WeChat : 1902433859   小月

WeChat : 1251743084   小单


开课时间9月2日


课程大纲http://51reboot.com/course/actual/

(阅读原文,即可跳转)



以上是关于关于 WEB 前后端分离的要点总结(上)的主要内容,如果未能解决你的问题,请参考以下文章

关于前端,后端,MVC,前后端分离,前后端同构

关于Web实现前后端分离,前后端解耦

秒懂《前后端分离》之谬误

码农面试失败,关于前后端分离他是这么回答的!网友:挂的不冤!

vue+mockjs 模拟数据,实现前后端分离开发

总结 | 如何看待用 NodeJS 进行前后端分离?