美文网首页
bottle下关于前后端分离的跨域问题新思考

bottle下关于前后端分离的跨域问题新思考

作者: 小钟钟同学 | 来源:发表于2020-01-10 17:11 被阅读0次

关于跨域的问题,最近重新封装了相关Bottle后,有些新的问题。

问题1:再封装统一返回响应体的时候,再钩子函数的相关的跨域会随之失效,所以需要再自定里面返回相关的请求跨域信息:

from bottle import HTTPResponse, response, request
from basic.xhelper.json_helper import dict_to_json_ensure_ascii_indent
from basic.xhelper.datetime_helper import get_timestamp13


class _BasicResponse(HTTPResponse):
    message = '抱歉,服务器未知错误'
    error_code = 999
    code = 500


    # 默认支持跨域----头部信息设置
    customize_headers = {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Credentials':'true',
        'Access-Control-Allow-Methods':'GET,POST,PUT,OPTIONS,DEL',
        'Access-Control-Allow-Headers': '*',
    }
    def __init__(self, status=code, body=None,**options):
        if not body:
            body = dict(
                message=self.message,
                code=self.code,
                error_code=self.error_code
            )

        # 设置返回响应体信息
        self.body = dict_to_json_ensure_ascii_indent(body)

        # 响应头的信息设置
        # 如果自定义的头部信息存在
        if self.customize_headers:
            curr_headers = self.customize_headers
        else:
            # 默认的允许进行跨域请求处理
            self.headers['Access-Control-Allow-Origin'] = '*'
            self.headers['Access-Control-Allow-Credentials'] = 'true'
            self.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,OPTIONS,DEL'
            self.headers['Access-Control-Allow-Headers'] = "*"
            curr_headers = self.headers


            # response.content_boby_text = json_helper.dict_to_json(body)
            # print('status',status)
            # self.body = json_helper.dict_to_json(body)

        super(_BasicResponse, self).__init__(body=self.body, headers=curr_headers, status=status, **options)



class ApiResponse(_BasicResponse):
    # 定义返回响应码--如果不指定的话则默认都是返回200
    code = 200
    error_code = 0
    result = None  # 结果可以是{} 或 []
    message = '成功'
    success = True
    timestamp = get_timestamp13()

    def __init__(self,message=None,code=None, result=None,error_code=None, **options):

        # print(message)
        # print(self.message)
        if error_code:
            self.error_code = error_code
        if result:
            self.result = result
        # 自定义的信息传入
        # 需要传入
        if message:
            self.message = message
        # 需要传入
        if code:
            self.code = code

        # 返回内容体
        body = dict(
            message=self.message,
            code=self.code,
            result=self.result,
            error_code=self.error_code,
            success=self.success,
            timestamp=self.timestamp
        )
        # 删除不必要的响应体信息
        if not self.result:
            del body['result']

        if not self.error_code:
            del body['error_code']

        # 记录相关的响应体的信息,用于日志的记录
        response.content_boby_text = body
        #
        self.body = body
        # 返回的数据格式
        # self.body = json_helper.dict_to_json(body)
        # 注意两者的有区别--返回自身定义的--返回传入的code响应码
        super(ApiResponse, self).__init__(status=self.code,body=self.body, **options)
        # 返回父类定义--返回200的响应码
        # super(ApiResponse, self).__init__(status=code, body=body, **options)



class BadrequestException(ApiResponse):
    code = 400
    message = '错误的请求'
    error_code = 10031

class ParameterException(ApiResponse):
    code = 400
    message = '参数校验错误'
    error_code = 10031

class UnauthorizedException(ApiResponse):
    code = 401
    message = '未经许可授权'
    error_code = 10032

class ForbiddenException(ApiResponse):
    code = 403
    message = '当前访问没有权限'
    error_code = 10033

class NotfoundException(ApiResponse):
    code = 404
    message = '访问地址不存在'
    error_code = 10034

class MethodnotallowedException(ApiResponse):
    code = 405
    message = '不允许使用此方法提交访问'
    error_code = 10034

class ContentTypeException(ApiResponse):
    code = 405
    message = '暂不支持Content-Type: multipart/form-data类型的表单提交'
    error_code = 10034

class OptionsRequest(ApiResponse):
    code = 200
    message = 'ok'

class OtherException(ApiResponse):
    code = 800
    message = '未知的其他HTTPEOOER异常'
    error_code = 10034


class InternalErrorException(ApiResponse):
    code = 500
    result = None  # 结果可以是{} 或 []
    # message = 'Internal Server Error'
    message = ' 服务崩溃异常'

class RateLimitApiException(ApiResponse):
    code = 429
    result = None  # 结果可以是{} 或 []
    # message = 'Internal Server Error'
    message = '请求次数受限'

问题2:前端axios POST提交数据的使用不同的请求头的时候有三种


image.png

问题1:


当使用multipart/form-data,会导致Bottle的进程读取异常,目前这个暂时未知,目前暂时对此类型的请求头进行限制处理,避免提交的请求。

问题2:


当使用application/x-www-form-urlencoded; charset=utf-8;的时候,虽然不会触发预校验机制,但是提交的数据的格式不对,后端使用相关的wtf解析提交的参数的时候出现了异常。

问题3:


当使用application/json;charset=utf-8的时候,会触发预校验机制,但是提交的数据的格式正确,后端使用相关的wtf解析提交的参数可以正常,、
唯一的缺点就是需要针对预校验的发起的OPTIONS做相关的about处理,避免进入的路由层去检测。

image.png

相关文章

网友评论

      本文标题:bottle下关于前后端分离的跨域问题新思考

      本文链接:https://www.haomeiwen.com/subject/kprpactx.html