bottle下关于前后端分离的跨域问题新思考
2020-01-10 本文已影响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