- Nov 2024
-
python.plainenglish.io python.plainenglish.io
-
Deploying Machine Learning Models with Flask and AWS Lambda: A Complete Guide
In essence, this article is about:
1) Training a sample model and uploading it to an S3 bucket:
```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression import joblib
Load the Iris dataset
iris = load_iris() X, y = iris.data, iris.target
Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Train the logistic regression model
model = LogisticRegression(max_iter=200) model.fit(X_train, y_train)
Save the trained model to a file
joblib.dump(model, 'model.pkl') ```
- Creating a sample Zappa config, because AWS Lambda doesn’t natively support Flask, we need to use Zappa, a tool that helps deploy WSGI applications (like Flask) to AWS Lambda:
```json { "dev": { "app_function": "app.app", "exclude": [ "boto3", "dateutil", "botocore", "s3transfer", "concurrent" ], "profile_name": null, "project_name": "flask-test-app", "runtime": "python3.10", "s3_bucket": "zappa-31096o41b" },
"production": { "app_function": "app.app", "exclude": [ "boto3", "dateutil", "botocore", "s3transfer", "concurrent" ], "profile_name": null, "project_name": "flask-test-app", "runtime": "python3.10", "s3_bucket": "zappa-31096o41b" }
} ```
- Writing a sample Flask app:
```python import boto3 import joblib import os
Initialize the Flask app
app = Flask(name)
S3 client to download the model
s3 = boto3.client('s3')
Download the model from S3 when the app starts
s3.download_file('your-s3-bucket-name', 'model.pkl', '/tmp/model.pkl') model = joblib.load('/tmp/model.pkl')
@app.route('/predict', methods=['POST']) def predict(): # Get the data from the POST request data = request.get_json(force=True)
# Convert the data into a numpy array input_data = np.array(data['input']).reshape(1, -1) # Make a prediction using the model prediction = model.predict(input_data) # Return the prediction as a JSON response return jsonify({'prediction': int(prediction[0])})
if name == 'main': app.run(debug=True) ```
- Deploying this app to production (to AWS):
bash zappa deploy production
and later eventually updating it:
bash zappa update production
- We should get a URL like this:
https://xyz123.execute-api.us-east-1.amazonaws.com/production
which we can query:
curl -X POST -H "Content-Type: application/json" -d '{"input": [5.1, 3.5, 1.4, 0.2]}' https://xyz123.execute-api.us-east-1.amazonaws.com/production/predict
-
- Nov 2023
-
circleci.com circleci.com
-
basicConfig
هم بهش میگه خروجی را کجا بریزه و هم براش یه Level تعیین کرد. طبیعتا اگر Level در حد Critical باشه، دیگه نمیره سراغ Info.
-
format
چقد قشنگ Format را تعریف کرده
-
basicConfig
هم بهش میگه خروجی را کجا بریزه و هم براش یه Level تعیین کرد.
-
Debug
Debug Level: اطلاعات Debugger مثل همون System.log ها است
-
confirmation message
Level Info: این برای نشون دادن FLow برنامه و یه جورایی برای Confirmation Messages است
-
- Jul 2023
-
www.tutorialspoint.com www.tutorialspoint.com
-
A de
ما یه چیز دیگه هم داریم به نام @before_request که اونم خیلی جالبه
-
Modern web
این Routing در واقع برای map کردن یک HTTP Request به یک Function است. مثل اینکه این Routing میتونن به انواع و اقسام HTTP Requst جواب بدن مثل GET و POST و غیره. در واقع در نهایت یک Routing Table درست میشه که هر URL به یک تیکه کدی وصل می کنه و به این Routing Table یا Routing Engine کفته می شود.(یاد مفهوم Routing Table در لایه 3 یا network افتادم)
برای status code می تونی بعد اون return سااده بنویسی 200 return "Would you like some tea?", 200
Tags
Annotators
URL
-
-
testdriven.io testdriven.io
-
o con
حالا می خواد بره با Axios وصلش کنه
-
e
حالا رفت سراغ Vue
-
requests
در واقع تعیین می کنه که درخواست ها از چه پروتکلی، با چه IP یا Domain Name و رو چه Port می تونی جواب بدی. خیلی خووبه براش تعیین کنی تو فقط باید از این IP و Port که در Front تعیین کردی استفاده کنی
-
Flask-CORS
تازه رفت سراغ Flask-origin چقد جاالب.
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
)
یه سری چیز دیگه هم هست use_reloader انگار پس از هر تغییری خودش restart می کنه threaded یعنی هر request را به یک thread بسپاری
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
.
ما یه سری چیز جالب دیگه هم داریم که اینجا نیورده request.json request.data
-
method
از همین استفاده می کرد که بتونه بفهمه الان با Method به نام Request یا Response
-
Form
این داخلش اطلاعاتی که به وسیله POST و در داخل Form در سمت View درست شده است را میفرستن تو این Object که انگار یک Dictionary هم هست. خیلی بهتر در این سایت برات نوشتم. https://www.digitalocean.com/community/tutorials/processing-incoming-request-data-in-flask
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
abort(401)
اینم اولین باره من دارم می بینم. مثل اینکه قدیمیه ولی کسی دیگه از این استفاده نمی کنه
-
url_for
من تا الان همچین تابعی ندیده بودم. فقط اسم اون url را میده. build a URL dynamically بعضی وقتا می خوای بر اساس ورودی کاربر به url های مختلفی اون را بفرستی که برای این کار از url_for استفاده می کنند. هر چی پارامتر بعد بهش بدی میشه در واقع همون پارامترهای اون تابع: url_for('cricket',favteam = team) مثالش اینجاس: https://www.geeksforgeeks.org/flask-url-helper-function-flask-url_for/
-
redirect()
که خب برای وقتایی هست که تو میخوای در یک تابعی هستی و درخواست را بفرستی برای یک تابع دیگه کخ اون Handle کنه. مثلا وقتی User و Pass نداره بره تو صفحه Signup. سه تا پارامتر میگیره شامل location که آدرسی که میخواد نتیجه بره و statuscode که خب طبیعتا 302 است و response نفهمیدم.
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
return resp
همیشه برای Return شدن میومدیم از render_template استفاده می کردیم ولی ایندفعه کار باحالی کرده و با make_response این کار را کرده. چه جالب اینجوری Set می کنه. دقت داشته باش که با این make response میشه خیلی کارا کرد از جمله Set کردن Status Code برای Response و mimetype و headers.
- myResponse = make_response('Response')
- myResponse.headers['customHeader'] = 'This is a custom header'
- myResponse.status_code = 403
- myResponse.mimetype = 'video/mp4'
-
request.cookies.get
اینم نحوه get کردن که مثل همیشه از طریق request این کار را می کنه
-
Read
برای Set شدن باید از سمت Server بیاد و برای Get شدن باید از سمت Client بیاد. برای Get کردنم که همون طور که میدونی خود مرورگر Client برات تو همون درخوسات های Get برات این Cookie را هم میفرسته
-
In Flask
برای Set شدن باید از سمت Server بیاد و برای Get شدن باید از سمت Client بیاد. همون جور که میدونی برای برای درست کردن response ا دستوری به نام make_response() استفده می کنیم . تو این دستور از تابعی به نام set_cookie استفاده می کنیم که میره برات یک Cookie را ذخیره می کنه.
-
client’s computer
اقا این Cookie همون جور که می دونی به عنوان بخشی از پروتکل http کار می کند و برای ذخیره کردن اطلاعات کاربر به کار می رود. من تو Onenote برات نوشتم. برای دسترسی به Cookie ها، داخل Request Object می تونی با attr به نام cookie بهش دسترسی داشته باشی. یک سری Extra Date داره.
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
ven belo
اقا دقت کن که من form در یک جلسه قبل گفتم حالا اومده تو صفحه student.html یک فرم گذاشته که تو فرمش گفته بفرس به result (البته من تو digital occean خوندم که باید بفرسته به همون جایی که ازش form را گرفته و این برام عحیبه) به هر حال در result گفته با post بگیر و اطلاعات را از طریق request.form بگیر و حالا با صفحه result اون اطلاعات را به کاربر نشون بده. خیلی ساده و قشنگ
-
-
www.digitalocean.com www.digitalocean.com
-
If the JSON o
نکته خیلی مهمی که میگه اینه که حتما باید Value ها حاوی کلید باشند مگرنه به مشکل میخوره
-
request.get_json()
چه تابع جالبی که میاد اطلاعات JSON را به Python تبدیل می کند
-
s:
قوانین تبدیل JSON به Python dict: اولا اگر در Json حالت Key و Value داشته باشد، در پایتون به صورت Dictionary است. دوما آرایه در Json به List در پایتون تبدیل می شود. سوما Value هایی که داخل " " باشد به Sting در پایتون تبدیل می شود. چهارما باحاله نگاه کن :) پنجما اعدادی که " " نداشته باشد به اعداد تبدیل می شود.
-
In P
هر وقت اسم JSON پیش می اید نام POSTMAN می درخشد
-
Usin
حالا رفت سراغ Json چون خیلی بهتر از Query String و Form Data براد اطلاعات را میفرسته. برای اطلاعات پیچیده تر بهتر است.
-
Inside
شاهکارش برای Handle کردن FORM. خیلی خووبه یاد بیگیر
-
The most important thing to know about this form is that it performs a POST request to the same route that generated the form.
این فرم POST Request را میفرسته به همون URL که این Form را Generate کرده. دقتم داشته باش که این فیلد ها را بعدا میشه در Object به نام Form گرفت و اسمشم همونایی که در Attribute به نام name گذاشتیم که اینجا language و Framework است
-
To de
جالبه برای درست کردن Form اومده هر دو تابع GET و POST را گذاشته و اینجوری تو موقع Get که فرم را میفرسته
-
Form data
از اینجا در مورد object به نام Form توزیح می دهد که اطلاعاتی که تو اطلاعاتی که در From و در تابع POST میفرستی میاد در Object به نام Form
-
reques
دو جورمیاد اون Query String را میگیره request.args.get request.args حس می کنم که این args یک Array است دقت داشته باش که language یک کلید است و با این دستور میاد محتوا را میگیره. در صورتی request.args.get که حتی اگر language هم خالی باشه بازم مشکلی در اجرای برنامه پیش نمیاد، البته اگه برنامه تو اینا Handle کنه و مقدار خروجی اش برابر None است. در صورتی که request.args بخوای بری اگر نداشته باشه بهت خطای 400 میده.
-
A query string
اینجا داره query string هاشا درست میکنه
-
This tutoria
اینجا که برات پیش نیازها را نوشته
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
static file su
اینجا تو بحث Static فایل ها است که مثل JS و CSS است. میگه به صورت عمومی این کار Web Server است ولی در موقع Develope باید این فایل ها را در پوشه Static بذاریم.
-
A special endpoint ‘static’ is used to generate URL for static files.
خیلی جالبه میگه فقط با گفتن کلید واژه static خودش برات URL دسترسی به این پوشه را درست می کنه. الان تو مثالشم ببینی میاد با یه url_for() و یک کلید واژه static و اسم فایل، اون فایل را برات Serve می کنه
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
render_template
این render_template که بذاری یعنی برو از Template Engine بخون . با این تابع میگی برو از تو پوشه TEMPLATE و فایل hello را بخون
-
ro
ببین من خیلی با اینجاش دیگه موافق نیستم چون تو Return به جای یک عبارت ساده، میاد یه HTML می نویسه و این هر جوری حساب کنی تخمیه و ما نباید اینجوری بریمو باید Json پس بده. این روش کلا اشتباس
Tags
Annotators
URL
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
args
جالبه این args من نمیدونم کجاها به درد میخوره
-
request
اول همه باید خیلی خوووب دید داشته باشی نسبت به Request و Response در موقع درخواست POST. این جا از یک ابجکت جدید رونمایی کرد به نام request و در موقع پست توی request اطلاعات ارسالی است(دقت داشته باش که توی body اون اطالاعات ارسالی است) و تو Response حالا 200 می تونه باشه(مجیدی دوباره اطلاعات ارسالی را پس میفرستاد)
-
The following tabl
متدهای اصلی HTTP را داره میگه
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
dynamically building a URL
با این تابع که بهش میگن url_for میشه یک تابع دیگه را اجرا کنی. توی اولین ارگومانش اسم تابعی که باید Redirect بشه را میدی و توی آزگومان های بعدی در واقع باید همون Variable Rule یا Variable Name ها را بدی
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
variable parts
بخ این که میان یه URL را به تابع وصل می کنند میگن Rule یا URL RULES(مثل همین چیزهایی که در iptables است) به این کاری که ما داریم اینجا انجام میدیم میگن Variable Rule به اون که داخل پرانتزه میگن Parameter به اون چیزی که داخل < > است نیگن Variable Name * نکته مهم این است که باید حواست باشه که اسم Variable Name با اسم اونی که تو تابع میده یکی است
-
python or /python/
به صورت پیش فرض هم /python و هم /python/ یکی است ولی جالبه برای Flask اینجوری نیس که این قواعد از Wekzeug میاد
-
n add
به صورت پیش فرض این Variable Rule به صورت رشته است. ولی میشه Integer یا FLoat هم باشد که نمونه هاش را میبینی
-
- Jun 2023
-
www.tutorialspoint.com www.tutorialspoint.com
-
The add_url_rule() fu
البته میگه یه جور دیگه هم این را گفت و اونم اینکه با متدی به نام add_url_rule این URL را به این تابع وصل کنی
Tags
Annotators
URL
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
above example, ‘/’ URL is bound wit
اصطلاحا میگن این URL به این تابع Bind شد
-
app.run
این متد هم ماله Flask و توش میتونی host که ما اینجا 127.0.0.1 است. نمیدونم این 0.0.0.0 به چه دردی میخوره. اون پورت که به صورت پیش فرض برابر 5000 است. اون Debug باید فعال کنی و Option که برو بعدا ببین به چه دردی میخوره.
-
Th
بعدا ببینیم اینا چی هستن
-
route() function of the Flask class is a decorator
این @app.route یه Decorator است یعنی میاد روی سر یک Function و یک سری عملکرد اون را افزایش می دهد. مثل همون مثال که زد و Log انداخت و اینا.
-
Flask constructor t
نمیدونم Constructor برای چی این name را می گیره
-
An object of Flask
جالبه این Flask خودش یه WSGI را داره
Tags
Annotators
URL
-
-
www.tutorialspoint.com www.tutorialspoint.com
-
templating engine
اینم یک template engine کامل است که خب اومده بین کد های html ، از certain data source برای رندر شدن Dynammic Web Pages استفاده می کند.
Tags
Annotators
URL
-
- Feb 2021
-
towardsdatascience.com towardsdatascience.com
-
When we are providing our API endpoint to frontend team we need to ensure that we don’t overwhelm them with preprocessing technicalities.We might not always have a Python backend server (eg. Node.js server) so using numpy and keras libraries, for preprocessing, might be a pain.If we are planning to serve multiple models then we will have to create multiple TensorFlow Serving servers and will have to add new URLs to our frontend code. But our Flask server would keep the domain URL same and we only need to add a new route (a function).Providing subscription-based access, exception handling and other tasks can be carried out in the Flask app.
4 reasons why we might need Flask apart from TensorFlow serving
-
-
itnext.io itnext.io
-
The most common way to deploy a trained model is to save into the binary format of the tool of your choice, wrap it in a microservice (for example a Python Flask application) and use it for inference.
Model as Code <--- the most common way of deploying ML models
-
- Oct 2020
-
datarevenue.com datarevenue.com
-
Here’s a table showing the tradeoffs:
Comparison of dashboard tech stack as of 10/2020:
-
- Jun 2020
-
flask-sqlalchemy.palletsprojects.com flask-sqlalchemy.palletsprojects.com
-
flask_sqlalchemy.get_debug_queries()
Dumps out query history-super helpful for debug!
-
-
stackoverflow.com stackoverflow.com
-
session_options={"autoflush": False, "autocommit": False, "expire_on_commit": False}
Disable autocommit and autoflush in sqlalchemy.
-
-
www.educative.io www.educative.io
-
The philosophy behind Flask is that it gives only the components you need to build an app so that you have the flexibility and control. In other words, it’s un-opinionated. Some features it offers are a build-int dev server, Restful request dispatching, Http request handling, and much more.
Flask isn't as full of features as Django (which makes him lighter), but it still offers:
- build-int dev server
- Restful request dispatching
- HTTP request handling
- much more...
Tags
Annotators
URL
-
- Apr 2020
-
blog.miguelgrinberg.com blog.miguelgrinberg.com
-
Although Miguel's tutorial is excellent, this companion piece by vsupalov can be helpful.
-
-
code.visualstudio.com code.visualstudio.com
-
To use Gunicorn as your web server, it must be included in the requirements.txt file as an app dependency. It does not need to be installed in your virtual environment/host machine.
-
-
flask-sqlalchemy.palletsprojects.com flask-sqlalchemy.palletsprojects.com
-
flask-login.readthedocs.io flask-login.readthedocs.io
-
xvrdm.github.io xvrdm.github.io
-
db.session.remove()
-
-
flask.palletsprojects.com flask.palletsprojects.com
Tags
Annotators
URL
-
- Dec 2019
-
stackoverflow.com stackoverflow.com
-
Werkzeug provides a development server: a simple web server that you can run with a single command and almost no configuration. When you do flask run (or werkzeug.serving.run_simple()), this development server is what you are getting
-
- Aug 2019
- Jun 2019
-
blog.miguelgrinberg.com blog.miguelgrinberg.com
-
Flask-Sockets, another extension for Flask that makes the use of WebSocket accessible to Flask applications
-
- Jun 2018
-
kronosapiens.github.io kronosapiens.github.io
-
Hmm. Definitely more http:// and a little more / than there needs to be. It seems like SERVER_NAME should be set to something more like localhost:5000. Let’s try.
Still having issues when it comes to multi application routing.
-
- Sep 2017
-
www.yanyaozhen.com www.yanyaozhen.com
-
flask部署
-
-
spacewander.github.io spacewander.github.io
- Apr 2017
-
stackoverflow.com stackoverflow.com
- Jul 2015
-
www.talkpythontome.com www.talkpythontome.com
-
Podcat with Armin Ronanch, creator of the my personal favorite web microframework, Flask.
-