programing

Flask RESTful 교차 도메인 문제 Angular: PUT, OPTIONS 메서드

starjava 2023. 4. 2. 09:39
반응형

Flask RESTful 교차 도메인 문제 Angular: PUT, OPTIONS 메서드

저는 Flask Restful과 함께 작은 쓰기 전용 REST api를 개발했습니다.이것은 IP 주소가 변경될 가능성이 있는 소수의 클라이언트로부터 PUT 요구를 받아들입니다.내 고객은 Angular를 실행하는 임베디드 크롬 클라이언트입니다.JS 프런트 엔드는 간단한 마법 키로 API를 인증합니다. 매우 제한된 규모에도 충분합니다.

저는 지금 API를 도입하는 테스트를 하고 있는데, Angular 클라이언트가 OPTIONS http 메서드를 플라스크 서비스에 전송하려고 하는 것을 알게 되었습니다.한편, 제 API는 404로 응답하고 있습니다(아직 OPTIONS 핸들러를 작성하지 않았기 때문에 PUT 핸들러만 작성).POST 또는 GET이 아닌 크로스 도메인 요구를 송신할 때 Angular는 서버에서 프리플라이트 OPTIONS 메서드를 송신하여 크로스 도메인 요구가 실제 요구를 송신하기 전에 받아들여지는 것을 확인합니다.그래요?

그나저나 플라스크 Restful API에 대한 모든 크로스 도메인 PUT 요청을 허용하려면 어떻게 해야 하나요?이전에 (휴식이 없는) 플라스크 인스턴스와 함께 크로스 도메인 데코레이터를 사용한 적이 있는데 OPTIONS 핸들러도 API에 써야 하나요?

Flask-CORS 모듈을 사용하면 코드를 변경하지 않고 교차 도메인 요청을 수행할 수 있습니다.

from flask.ext.cors import CORS

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

갱신하다

Eric의 제안대로 이 모듈은 더 이상 사용되지 않으므로 다음 코드를 사용해야 합니다.

from flask_cors import CORS

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

after_request 훅을 사용할 수 있습니다.

@app.after_requestdef after_request(응답):
대답.headers.add('액세스 제어'-Allow-Origin', '*')대답.headers.add('Access-Control-Allow-Headers', 'Content-Type',인가')대답.headers.add('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE')답신호

PUT 응답에 Access-Control-Allow-Origin 헤더로 응답하도록 플라스크 백엔드를 다시 쓰는 것으로 문제를 해결했습니다.또한 플라스크 앱에서 OPTIONS 핸들러를 생성하여 http RFC에서 읽은 내용에 따라 OPTIONS 메서드에 응답하였습니다.

PUT 방식의 리턴은 다음과 같습니다.

return restful.request.form, 201, {'Access-Control-Allow-Origin': '*'} 

OPTIONS 메서드 핸들러는 다음과 같습니다.

def options (self):
    return {'Allow' : 'PUT' }, 200, \
    { 'Access-Control-Allow-Origin': '*', \
      'Access-Control-Allow-Methods' : 'PUT,GET' }

@tbicr이 맞습니다: 플라스크는 OPTIONS 방법에 자동으로 응답합니다.단, 내 경우 Access-Control-Allow-Origin 헤더를 해당 응답으로 전송하지 않았기 때문에 브라우저는 교차 도메인 요청이 허용되지 않음을 암시하는 것처럼 보이는 응답을 api에서 받고 있었습니다.제 경우 옵션 요청을 오버로드하여 ACAO 헤더를 추가했는데 브라우저가 만족하는 듯 PUT로 OPTIONS를 팔로우했습니다.

이 회피책은 어떻습니까?

from flask import Flask
from flask.ext import restful
from flask.ext.restful import Api
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('config')

#flask-sqlalchemy
db = SQLAlchemy(app)

#flask-restful
api = restful.Api(app)

@app.after_request

def after_request(response):
  response.headers.add('Access-Control-Allow-Origin', '*')
  response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
  response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
  return response

import views

이건 이 튜토리얼에서 따온 거예요.아주 잘 작동한다.사실, 지금까지 본 것 중 가장 좋은 방법인 것 같아요.

★★★★{'Access-Control-Allow-Origin': '*'}모든 엔드포인트에 추가해야 하기 때문에 효율적이지 않은 것 같습니다. 적어도 저에겐요.

는 는 i i는노노 i i i i i.@cors.crossdomain(origin='*')GET 요청이 있을 만 작동되는 것 같습니다.

말이 맞아, 네 말이 맞아.OPTIONS브라우저에서 실제 요청이 있기 전에 매번 호출되는 메서드입니다. OPTIONS응답에 허용된 메서드와 헤더가 있습니다.으로 가공됩니다.OPTIONS청한한다

에 API가 있어야 .Access-Control-Allow-Origin머리글할 수 , 하는 경우 ""로 할 수 .Access-Control-Allow-Origin: *.

for CORS를 flask1개의 확장 코드를 참조하거나 이 확장자를 사용해 보십시오.https://github.com/wcdolphin/flask-cors/blob/master/flask_cors.py

for CORS를 flask-restfulhttps://github.com/twilio/flask-restful/pull/122 및 https://github.com/twilio/flask-restful/pull/131 의 풀 요구를 확인합니다.근데 뭐랄까...flask-restful에서는 아직 디폴트로 지원되지 않습니다.

이 코멘트의 최신 정보입니다.플라스크 CORS를 사용하는 것이 좋지만 플라스크.ext.cors는 권장되지 않습니다.

" " " from flask_cors import CORS

웹 서비스 API에서 원격 CORS 요청을 허용하려면 다음과 같이 플라스크 안정 API를 초기화하면 됩니다.

from flask import Flask
from flask_restful import reqparse, abort, Api, Resource
from flask_cors import CORS

app = Flask(__name__)
cors = CORS(app, resources={r"*": {"origins": "*"}})
api = Api(app)

그러면 API 인스턴스에 CORS 헤더가 추가되어 모든 발신기지로부터의 모든 경로에서 CORS 요구가 허용됩니다.

저는 데코레이션으로 해결하는 것을 좋아합니다.

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

그런 다음 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

각도에서 플라스크레스트 API에 접속하는 동안 여러 종류의 CORS 문제에 직면하여 거의 모든 방법을 시도했습니다.
아래 할 수 .app.py :크크::

from flask_cors import CORS , cross_origin

cors = CORS(app, resources={r"/*": {"origins": "*"}})

이것은 동작합니다만, 항상 오리진에서 편집할 수 있는 시큐러티를 가지는 것을 추천합니다.

언급URL : https://stackoverflow.com/questions/19962699/flask-restful-cross-domain-issue-with-angular-put-options-methods

반응형