zoukankan      html  css  js  c++  java
  • django-腾讯paas-appengine阅读

    1 重写View基类的dispatch函数

    api/baseview.py

    在一个post请求中,在header中,CONTENT_TYPE为application/json,然后在request.body中发送json格式的数据(exp:{"mode":"test","agent_ip":"192.168.1.1","web_port":8000,"agent_port":12345}),这时,在django的request参数中,它是一个bytes数据。

    在CBV中,View类都实现了dispatch函数,我们可以通过重写dispatch方法来自定义处理请求(参考https://www.jianshu.com/p/8c23d72878d9

    这个dispatch就把这个bytes数据转化为dict数据,赋值给request.json_data。

    class BaseView(View):
    
        def dispatch(self, request, *args, **kwargs):
            if request.method == "POST":
                if "application/json" in self.request.META["CONTENT_TYPE"]:
                    if request.body:
                        request.json_data = json.loads(request.body)
                    else:
                        request.json_data = {}
            return super(BaseView, self).dispatch(request, *args, **kwargs)
    

      

    2 自定义异常

    api/response.py

    class FailJsonResponse(JsonResponse):
        def __init__(self, message, **kwargs):
            data = {}
            if kwargs:
                data.update(kwargs)
    
            # high priority
            data.update({
                "result": False,
                "message": message
            })
    
            if "data" not in data:
                data["data"] = {}
    
            super(FailJsonResponse, self).__init__(data)
    

      

    3 对app做健康检查

    api/utils.py

    def agent_header(sid, token):
        return {
            "Content-Type": "application/json",
            "X-ID": str(sid),
            "X-TOKEN": str(token)
        }
    
    
    def check_agent_health(bk_server):
        resp = http.http_request(
            method="GET",
            url="http://%s:%s/v1/app/healthz" % (bk_server.ip_address, bk_server.ip_port),
            headers=agent_header(bk_server.s_id, bk_server.token)
        )
        if resp.get("error") != 0:
            raise Exception("%s agent return not zero" % bk_server.ip_address)
        return resp
    

      

    4 使用UUIDField

    api/models.py

    UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性, 有着固定的大小( 128 bit ).  

    python中的uuid4函数是随机数生成UUID。用来生成服务id和token

    class BkServer(models.Model):
        name = models.CharField(u'名称', max_length=20)
        s_id = models.UUIDField(u'服务ID', default=uuid.uuid4, editable=False)
        token = models.UUIDField(default=uuid.uuid4, editable=False)
    

      

    5 写JsonResponse的子类来处理json信息

  • 相关阅读:
    BZOJ1042: [HAOI2008]硬币购物
    BZOJ1089: [SCOI2003]严格n元树
    BZOJ1060: [ZJOI2007]时态同步
    BZOJ2697: 特技飞行
    BZOJ2464: 中山市选[2009]小明的游戏
    BZOJ1430: 小猴打架
    BZOJ3675: [Apio2014]序列分割
    BZOJ2453: 维护队列
    BZOJ2120: 数颜色
    BZOJ4547: Hdu5171 小奇的集合
  • 原文地址:https://www.cnblogs.com/jabbok/p/12230227.html
Copyright © 2011-2022 走看看