Added support for CORS

This commit is contained in:
2026-03-08 14:43:48 +01:00
parent 5bdff2a1e3
commit 03129d9dfa
5 changed files with 37 additions and 10 deletions
+1 -6
View File
@@ -289,9 +289,4 @@ This software uses the following third-party libraries. Full license texts are a
Author: Graham Dumpleton Author: Graham Dumpleton
License: BSD 2-Clause License License: BSD 2-Clause License
URL: https://github.com/GrahamDumpleton/wrapt URL: https://github.com/GrahamDumpleton/wrapt
See licenses/wrapt.txt for full license text. See licenses/wrapt.txt for full license text.
55. word-language-detector-ai
Author: Johannes D. Vos
License: MIT License
See licenses/word-language-detector-ai.txt for full license text.
+3
View File
@@ -54,6 +54,9 @@ For the full API documentation, see the docs path of the API.
## Changelog ## Changelog
### Version 0.2.0
- support for CORS
### Version 0.1.1 ### Version 0.1.1
- added `--break-system-packages` to `pip install ...` - added `--break-system-packages` to `pip install ...`
- bug fix: create model directory before downloading the model - bug fix: create model directory before downloading the model
+18
View File
@@ -5,6 +5,24 @@
# The port to listen. Default is 3000. # The port to listen. Default is 3000.
# port= # port=
# The Access-Control-Allow-Origin HTTP Header. It controls which origin
# is allowed to access the API. You can allow all origins by setting it
# to '*'. Default is '*'.
# Note: This only affects access via JavaScript in browsers. Moreover,
# a HTTP request is always sent when JavaScript in browsers attempts to
# access the API, even when it runs on a domain that is not allowed in
# 'allowOrigin'. In this case, however, the response is simply not made
# accessible for JavaScript.
# If the API is intended for access via a specific website, setting the
# property to the domain of the site is strongly recommended.
# Furthermore, note that this is not a protection for the API. It is
# simply a note for the browser to control which websites can access it.
# In a non-browser context, this has no effect.
# For an example, set it to 'http://example.com:8000' (NOT
# 'http://example.com:8000/') if you want to access the API from
# 'http://example.com:8000'.
# allowOrigin=
[docs] [docs]
# The path for the Swagger UI documentation. If an empty path is # The path for the Swagger UI documentation. If an empty path is
# specified, no Swagger UI documentation will be available. Default is # specified, no Swagger UI documentation will be available. Default is
+1
View File
@@ -4,6 +4,7 @@
[server] [server]
host=0.0.0.0 host=0.0.0.0
port=3000 port=3000
allowOrigin=*
[docs] [docs]
swagger=/docs swagger=/docs
+14 -4
View File
@@ -5,7 +5,8 @@
import os import os
# disable TensorFlow output # disable TensorFlow output
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
from fastapi import FastAPI from fastapi import FastAPI, Response
from fastapi.middleware.cors import CORSMiddleware
import uvicorn import uvicorn
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
import json import json
@@ -322,6 +323,7 @@ if ai_modules_lazy_import.lower() not in ('true', 'false'):
ai_modules_lazy_import = ai_modules_lazy_import.lower() == 'true' ai_modules_lazy_import = ai_modules_lazy_import.lower() == 'true'
allow_origin = configuration.server.allowOrigin
# Initialize cache # Initialize cache
@@ -365,16 +367,25 @@ app = FastAPI(
openapi_url=configuration.docs.openapi openapi_url=configuration.docs.openapi
) )
app.add_middleware(
CORSMiddleware,
allow_origins=[allow_origin],
allow_credentials=False,
allow_methods=['GET', 'POST'],
allow_headers=['*']
)
if not ai_modules_lazy_import: if not ai_modules_lazy_import:
load_ai() load_ai()
# predict word language # predict word language
@app.post('/prediction', response_model=LanguagesResponse) @app.post('/prediction', response_model=LanguagesResponse)
async def predict_language(words: Words): async def predict_language(words: Words, response: Response):
if not ai_loaded: if not ai_loaded:
load_ai(model_dir) load_ai(model_dir)
response.headers['Access-Control-Allow-Origin'] = allow_origin
response.headers['Access-Control-Allow-Origin'] = allow_origin
return { return {
'words': { 'words': {
w.word: { w.word: {
@@ -393,7 +404,6 @@ async def get_languages():
] ]
} }
# run Uvicorn # run Uvicorn
if __name__ == '__main__': if __name__ == '__main__':
uvicorn.run( uvicorn.run(