Flask RESTful cross-domain issue with Angular: PUT, OPTIONS methods

前端 未结 9 1126
臣服心动
臣服心动 2020-12-12 17:14

I\'ve developed a small write-only REST api with Flask Restful that accepts PUT request from a handful of clients that can potentially have changing IP addresses. My clients

9条回答
  •  半阙折子戏
    2020-12-12 17:38

    I like to use a decoration to solve.

    def cross_origin(origin="*"):
        def cross_origin(func):
            @functools.wraps(func)
            def _decoration(*args, **kwargs):
                ret = func(*args, **kwargs)
                _cross_origin_header = {"Access-Control-Allow-Origin": origin,
                                        "Access-Control-Allow-Headers":
                                            "Origin, X-Requested-With, Content-Type, Accept"}
                if isinstance(ret, tuple):
                    if len(ret) == 2 and isinstance(ret[0], dict) and isinstance(ret[1], int):
                        # this is for handle response like: ```{'status': 1, "data":"ok"}, 200```
                        return ret[0], ret[1], _cross_origin_header
                    elif isinstance(ret, basestring):
                        response = make_response(ret)
                        response.headers["Access-Control-Allow-Origin"] = origin
                        response.headers["Access-Control-Allow-Headers"] = "Origin, X-Requested-With, Content-Type, Accept"
                        return response
                    elif isinstance(ret, Response):
                        ret.headers["Access-Control-Allow-Origin"] = origin
                        ret.headers["Access-Control-Allow-Headers"] = "Origin, X-Requested-With, Content-Type, Accept"
                        return ret
                    else:
                        raise ValueError("Cannot handle cross origin, because the return value is not matched!")
                return ret
    
            return _decoration
    
        return cross_origin
    

    And then, Use decoration in your restful api.

    class ExampleRestfulApi(Resource)
        @cross_origin()
        def get(self):
            # allow all cross domain access
            pass
    
        @cross_origin(origin="192.168.1.100")
        def post(self):
            # allow 192.168.1.100 access
            pass
    

提交回复
热议问题