前后端分离的流程设计

之前自己分享过一版前后端分离的开发流程。

运维前后端分离的开发流程

这里需要提两个概念,一个是本地前端,另外一个是平台前端,本地前端是在内部迭代使用,界面可以简单一些,功能为主;平台前端是一个具有全局规划性的前端技术,简单来说,这是专业前端,会考虑用户体验度等等。

我们要做一件事情,首先这件事情得能做成,然后把这件事情能做好。本地前端是保证这件事情能做成,而平台前端是保证这件事情能做好(至少看起来好)。为了保证表里合一,那么我们需要的就是核心的逻辑是同一套。

所以提出这个概念之后,自己也在内部做了迭代和尝试,当然这个过程中也逐步的克服了一些技术恐惧的边界问题。其实回过头来看,事情似乎没想的那么痛苦。

我使用的是Django的基础框架,其实对于我来说,对于ORM的部分功能还是很认可的。但是使用了RESTful服务之后,其实很多逻辑可以上移到API层来做。比较理想的状况就是Django的view层不用做逻辑处理,只是做页面的跳转的form data的跳转等。

在这种情况下,后续如果要集成更加纯粹的前后端分离框架,其实就是水到渠成的事情了。

比如对于防火墙的处理,iptables_show和iptables_add的操作,目前在view层已经没有实际的业务逻辑了。

def iptables_show(request):
    return_dict = {}

    src_ip = request.GET.get('src_ip', None)
    if src_ip == None:
        return return_response(request, 'iptables_manage/iptables_query.html', return_dict)
    open_port = request.GET.get('open_port_list')
    url = LOCAL_SERVER_URL+'/api/iptables_list/?src_ip='+src_ip+'&open_port_list='+open_port

    result = api_access(url,'GET',request.user.id)
    return_dict['result'] = result

    return return_response(request, 'iptables_manage/iptables_query.html', return_dict)

def iptables_add(request):
    return_dict = {}
    if request.method == "GET":
        return return_response(request, 'iptables_manage/iptables_manage.html', return_dict)
    url = LOCAL_SERVER_URL+'/api/iptables_add'
    data = request.POST
    result = api_access(url,'POST',request.user.id,data)
    print(result)
    return_dict['result'] = result

    return return_response(request, 'iptables_manage/iptables_manage.html', return_dict)

这样一来,就可以对view层再做一层抽象,对前端的url可以做瘦身和精简,比如通过前端页面来配置API即可。

整个逻辑的实现,其实下面的部分是难点,比如Django中的view层的url为:iptables_show,那么在API层使用RESTful服务的时候,需要再配置一个url为:api/iptables_show,然后两个url之间的关联关系从程序调用来说,是没有程序层面的依赖的,是一种绝对的隔离,核心仅在于API的url部分。我们完全是把服务以API的形式来调用,这样后续接入平台前端的时候,就很容易了。毕竟本地前端已经验证过功能了。

def getresponse_Token(url, token, api_method,data=None):
    headers = {"Authorization": "Token %s" % token}
    ss = requests.Session()
    if api_method == 'GET':
        r = ss.get(url, headers=headers, verify=False)
    elif api_method == 'POST':
        r = ss.post(url, headers=headers, data=data,verify=False)
    elif api_method =='PUT':
        r = ss.put(url, headers=headers, data=data,verify=False)
    res = json.loads(r.text)
    return res


def api_access(url_str,api_method,user_id,data=None):
    if url_str == None:
        return ''

    if url_str != LOCAL_SERVER_URL+'/api':
        api_method = api_method
        user_id = user_id
        token = Token.objects.filter(user_id=user_id)

        rs = getresponse_Token(url_str, token[0],api_method,data)
    return rs

爱情保卫战:保卫你的爱情(印刷签名本)

作者:《爱情保卫战》栏目组

当当 广告

购买

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2018-06-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏顶级程序员

2018年2月份GitHub上最热门的Java开源项目

源 / 开源最前线 又到了揭晓 2 月份最热门 Java 开源项目排名的时候了,在本月的名单中,出现了几个新面孔,如下载神器 proxyee-down、能为应用...

83350
来自专栏java一日一条

java学习路线图(2018年最新版)

最近有些网友问我如何自学 Java 后端,还有些是想从别的方向想转过来,但都不太了解 Java 后端究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java 后...

26510
来自专栏JavaEdge

设计模式实战 - 中介者模式

以终端销售商(以服务最终客户为目标的企业,如超市)为例,采购部门要采购IBM的电脑,它根据以下两个要素来决定采购数量。

17540
来自专栏微信公众号:Java团长

一个Java高级工程师的进阶之路

一、 Java。要想成为JAVA(高级)工程师肯定要学习JAVA。一般的程序员或许只需知道一些JAVA的语法结构就可以应付了。但要成为JAVA(高级) 工程师,...

6910
来自专栏SDNLAB

VXLAN in OpenStack Neutron

35450
来自专栏Java成神之路

一个java高级工程师的进阶之路

一、 JAVA。要想成为JAVA(高级)工程师肯定要学习JAVA。一般的程序员或许只需知道一些JAVA的语法结构就可以应付了。但要成为JAVA(高级) 工程...

8710
来自专栏前沿技墅

超媒体:将客户端服务端分离进行到底

2017 年年末,就职小米的一位前同事送了我一枚 F 码,我用它抢购到一枚小爱音箱。我满怀期待地装上“小爱同学”,希望能够通过她用语音控制所有小米产品。但我失望...

17720
来自专栏Laoqi's Linux运维专列

缓存技术PK:选择Memcached还是Redis?

65960
来自专栏码匠的流水账

2017年终总结

又到了写年终总结的时候了。每当这个时候思绪总是翻江倒海,因为太久没有反思和总结的缘故,一年才总结一次,确实是有点久,欠的账的太多,梳理起来有点费劲。这里依旧还是...

30610
来自专栏北京马哥教育

10年 Windows 与 Linux 程序员的区别

如果一个程序员从来没有在Linux、Unix下开发过程序,一直在Windows下面开发程序,同样是工作10年,大部分情况下与在Linux、unix下面开发10年...

20500

扫码关注云+社区

领取腾讯云代金券