質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Chrome extension

Chrome拡張機能

Q&A

解決済

2回答

388閲覧

FlaskとChrome拡張を使って小規模フィルタリングシステムを構築したい

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Chrome extension

Chrome拡張機能

0グッド

0クリップ

投稿2023/06/23 13:51

実現したいこと

・FlaskとChrome拡張を使って小規模フィルタリングシステムを構築したい

前提

サイトブロックシステムをChromeの拡張機能とFlaskの判定サーバーで作っています。
URLを拡張からJavascripからGETを送ってFlaskの判定サーバーでreturnを使ってAllowかNoAllowを返しています。ですが、CROSの関係でjavascriptからGETリクエストを遅れません。送れるようになるスクリプトを教えてください。

発生している問題・エラーメッセージ

Access to XMLHttpRequest at 'http://127.0.0.1/?url=<exmaple.com>' from origin 'exmaple.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

該当のソースコード

Flask判定サーバー側(Python)

1from flask import Flask, request 2from flask_cors import CORS 3 4app = Flask(__name__) 5CORS(app) 6 7@app.route('/', methods=["GET"]) 8def filtering(): 9 URL = request.args.get('url') 10 if 'google.com' == URL: 11 print("NoAllow") 12 return 'NoAllow' 13 else: 14 print("Allow") 15 return 'Allow' 16app.run(port="80", host="0.0.0.0",)

Chrome拡張機能

1const BlockSite = chrome.runtime.getURL("message-page.html"); 2var URL = "" 3URL = location.host; 4 5var data_url = new XMLHttpRequest(); 6 7data_url.open('GET', 'http://127.0.0.1/?url=' + URL); 8data_url.withCredentials = true; 9data_url.setRequestHeader("Access-Control-Allow-Origin", "http://127.0.0.1"); 10data_url.send(); 11data_url.onreadystatechange = function() { 12 if(data_url.readyState === 4 && data_url.status === 200) { 13 console.log(data_url.responseText); 14 } 15}

試したこと

setRequestHeaderにAccsess-Control-Allow-Originをつけた
→改善せず

ajaxを使って構築しようとした
→分からなくて挫折した

補足情報(FW/ツールのバージョンなど)

環境はすべてローカルで動かしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

頑張りましたが、現象が再現しませんでした。

たぶんですが、提示されていない情報が原因な可能性が高いです。

エラーメッセージからすると、Flask側ではなく、example.comのCORSエラーなので、こちらで対応できることはありません。

現象を確認するのに使ったコードは以下です。

js

1"use strict"; 2 const BlockSite = chrome.runtime.getURL("message-page.html"); 3var URL = "<exmaple.com>" 4console.log(URL) 5// URL = location.host; 6var data_url = new XMLHttpRequest(); 7data_url.open('GET', 'http://127.0.0.1/?url=' + URL); 8data_url.withCredentials = true; 9data_url.setRequestHeader("Access-Control-Allow-Origin", "http://127.0.0.1"); 10data_url.send(); 11data_url.onreadystatechange = function() { 12 if(data_url.readyState === 4 && data_url.status === 200) { 13 console.log(data_url.responseText); 14 } 15} 16

見て分かるとおりURLを直接入れています。

アクセス先は?url=%3Cexample.com%3Eで、?url=<exmaple.com>へのアクセスにはなりません。

マニフェストで特殊な指定をしているとか、こちらが思いもよらないことをしているかもしれませんので、出せる情報を追加で出していただければなにか回答できるかもしれません。

XMLHttpRequestは歴史がありますが、使いやすいとはお世辞にも言えません。(エラーハンドリングが面倒なので。)
可能ならfetchを使うと良いです。
他にjQeuryajaxもありますが、どれも面倒なことは変わりないので、比較的新しいのを覚えた方が後々便利と思います。

投稿2023/06/27 00:28

FiroProchainezo

総合スコア2443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この回答はGPT-4による自動生成回答です

CORSの問題を解決するために、Flask側で適切なヘッダーを設定してみてください。以下のようにafter_requestデコレータを使用して、すべてのレスポンスにCORSヘッダーを追加します。

python

1from flask import Flask, request, make_response 2from flask_cors import CORS 3 4app = Flask(__name__) 5CORS(app) 6 7@app.route('/', methods=["GET"]) 8def filtering(): 9 URL = request.args.get('url') 10 if 'google.com' == URL: 11 print("NoAllow") 12 return 'NoAllow' 13 else: 14 print("Allow") 15 return 'Allow' 16 17@app.after_request 18def add_cors_headers(response): 19 response.headers.add('Access-Control-Allow-Origin', '*') 20 response.headers.add('Access-Control-Allow-Credentials', 'true') 21 response.headers.add('Access-Control-Allow-Headers', 'Content-Type') 22 response.headers.add('Access-Control-Allow-Methods', 'GET') 23 return response 24 25app.run(port="80", host="0.0.0.0",)

そして、JavaScript側ではwithCredentialsfalseに設定し、setRequestHeaderAccess-Control-Allow-Originを設定する必要はありません。

javascript

1const BlockSite = chrome.runtime.getURL("message-page.html"); 2var URL = "" 3URL = location.host; 4 5var data_url = new XMLHttpRequest(); 6 7data_url.open('GET', 'http://127.0.0.1/?url=' + URL); 8data_url.withCredentials = false; 9data_url.send(); 10data_url.onreadystatechange = function() { 11 if(data_url.readyState === 4 && data_url.status === 200) { 12 console.log(data_url.responseText); 13 } 14}

これでCORSの問題が解決されるはずです。

投稿2023/06/23 13:52

teratail-ai

Powered by GPT-4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問