3

Flask-Restless を使用して作成され、Apache を使用して提供される postgres データベース用の API があります。

OPTIONS リクエストに密接に関連していると思われる複数の「CORS Error Access-Control-Allow-Origin」ヘッダーを受け取ったときに、javascript ベースのフロントエンドを使用して API にアクセスしようとするまで、API は完全に機能します。

次の修正を試みました

[1.Apacheでcorsを有効にする][1]

 <VirtualHost *:80>
            Header add Access-Control-Allow-Origin "*"
            Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, Authorization"
            Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
            ServerName localhost
            WSGIScriptAlias / /home/drmclean/bboxx/git/Smart-Solar-Server/SmartSolarServer.wsgi
            WSGIScriptReloading On

            <Directory /home/drmclean/bboxx/git/Smart-Solar-Server/>
                    Header add Access-Control-Allow-Origin "*"
                    Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, Authorization"
                    Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
                    Require all granted
                    Order allow,deny
                    Allow from all
            </Directory>

            Alias /docs /home/drmclean/bboxx/git/Smart-Solar-Server/swagger
            <Directory /home/drmclean/bboxx/git/Smart-Solar-Server/swagger/>
                    Header add Access-Control-Allow-Origin "*"
                    Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, Authorization"
                    Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
                    Require all granted
                    Header set Access-Control-Allow-Origin "*"
                    Order allow,deny
                    Allow from all
            </Directory>
            ErrorLog ${APACHE_LOG_DIR}/error.log
            LogLevel warn
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            <IfModule mod_rewrite.c>
                    RewriteEngine on
                    # Pass Authorization headers to an environment variable
                    RewriteCond %{HTTP:Authorization} ^(.*)
                    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
            </IfModule>

2.flask-cors 拡張機能を使用して CORS を有効にします。

app = Flask(__name__, static_folder= paths.base_path+'/swagger/')
cors = CORS(app)

3.フラスコレストレスを使用してCORSを有効にします

def allow_control_headers(response):
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Credentials'] = 'true'
return response

bp = manager.create_api(REDACTED)
bp.after_request(allow_control_headers)

言うまでもなく、これまでに機能したものはありません。

  1. CORS 警告は削除されません。
  2. これを cors = CORS(app, response=r"/v1/*") に変更すると、最初に削除された CORS エラーが返されました。
  3. ドキュメントから直接構文をコピーしたにもかかわらず、「bp has no attribute after_request」という構文エラーがスローされました。(ここ)

誰でも説明できますか、

  1. 上記の修正で CORS の問題が解決されなかった理由。
  2. 問題を解決し、Cross-Origin-Resource-SHAring を効果的に有効にする方法は?
4

1 に答える 1

0

オプション 3 が最も近いですが、参照するドキュメントは、最新ではない特定のバージョンの Flask Restless のみを対象としています。Flask の after_this_request プロセッサを Flask Restless のプリプロセッサと組み合わせて使用​​することをお勧めします

def allow_control_headers(**kw):

    @after_this_request
    def add_headers(response):
        response.headers['Access-Control-Allow-Origin'] = '*'
        response.headers['Access-Control-Allow-Credentials'] = 'true'
        return response

bp = manager.create_api({
  ...
  'preprocessors: {'GET_SINGLE': [allow_control_headers]}
  ...
})
于 2018-03-29T20:02:11.110 に答える