flask

پلتفرم Flask

(Flask Platform)

🎯 توضیحات و نکات تکمیلی

فهرست عناوین:

انتخاب نسخه‌ی Python

به‌صورت پیش‌فرض برنامه‌ی شما روی Python 3.8 اجرا می‌شود. در صورتی که قصد دارید نسخه دیگری را برای اجرای برنامه‌ی‌تان استفاده کنید می‌توانید داخل فایل liara.json بخش زیر را اضافه کنید. توجه داشته باشید که فایل liara.json را باید در کنار فایل requirements.txt بسازید:

{
  "flask": {
    "pythonVersion": "3.12"
  }
}

  • 3.7
  • 3.8
  • 3.9
  • 3.10 (پیش‌فرض)
  • 3.11
  • 3.12

تنظیم منطقه‌ی زمانی (TimeZone)

به صورت پیش‌فرض، منطقه‌ی زمانی بر روی Asia/Tehran تنظیم شده است. برای تغییر مقدار پیش‌فرض، می‌توانید از پارامترtimezoneدر فایل liara.json استفاده کنید. برای نمونه:

{
  "app": "flask-starter",
  "flask": {
    "timezone": "America/Los_Angeles"
  }
}

افزایش زمان تایم‌اوت Gunicorn

درصورتی که در برنامه‌ی Flask خود با خطای [CRITICAL] WORKER TIMEOUT مواجه شده‌اید و به WORKER TIMEOUT بیشتر از ۳۰ ثانیه نیاز دارید می‌توانید وارد تنظیمات برنامه‌ی Flask خود شده و در بخش متغیرها، متغیر GUNICORN_TIMEOUT=60 را به‌شکل زیر اضافه کرده و درنهایت با کلیک بر روی دکمه ثبت تغییرات، WORKER TIMEOUT برنامه را افزایش دهید.

توجه داشته باشید که متغیر GUNICORN_TIMEOUT براساس ثانیه است.

تنظیمات Nginx

در برنامه‌های Flask لیارا از وب‌سرور Nginx استفاده می‌شود و پیکربندی پیش‌فرض این وب‌سرور به‌شکل زیر است:

location /public {
  alias /usr/src/app/public;
}
      
location / {
  try_files /dev/null @flask_app;
}

location ~\.sqlite3$ {
  deny all;
  error_page 403 =404 /;
}

location ~ /\.well-known {
  allow all;
}

حال شما می‌توانید یک فایل با نام liara_nginx.confدر مسیر اصلی پروژه‌ی خود ایجاد کرده و پیکربندی وب‌سرور Nginx را متناسب با نیاز خود تغییر دهید. برای مثال، برای فعال‌کردن فشرده‌سازیgzipمی‌توانید به‌شکل زیر عمل کنید:

gzip             on;
gzip_disable     "msie6";
gzip_vary        on;
gzip_proxied     any;
gzip_comp_level  6;
gzip_types       text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;

location /public {
  alias /usr/src/app/public;
}

location / {
  try_files /dev/null @flask_app;
}

location ~\.sqlite3$ {
  deny all;
  error_page 403 =404 /;
}

location ~ /\.well-known {
  allow all;
}

افزایش محدودیت حجم آپلود فایل

حداکثر حجم مجاز آپلود فایل در وب‌سرور Nginx به‌صورت پیش‌فرض 1MB در نظر گرفته شده است. برای تغییر این مقدار کافیست یک فایل با نام liara_nginx.conf در مسیر اصلی پروژه‌ی خود ایجاد کنید و مقدار client_max_body_size را براساس نیاز خود تنظیم کنید:

client_max_body_size 250M;

location /public {
  alias /usr/src/app/public;
}

location / {
  try_files /dev/null @flask_app;
}

location ~\.sqlite3$ {
  deny all;
  error_page 403 =404 /;
}

location ~ /\.well-known {
  allow all;
}

رفع خطای CORS

درصورتی که پس نصب و پیکربندی پکیج Flask-Cors با خطای CORS مواجه شده‌اید باید صحت resources را مورد بررسی قرار دهید:

from flask import Flask
from flask_cors import CORS

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

@app.route("/")
def helloWorld():
  return "Hello, cross-origin-world!"

غیرفعال کردن Mirror

Mirror اختصاصی لیارا به‌منظور دانلود سریع‌تر پکیج‌ها در پلتفرم Flask به‌صورت پیش‌فرض فعال است اما شما می‌توانید با قرار دادن قطعه‌کد زیر در فایل liara.json، این قابلیت را غیر فعال کنید:

{
  "flask": {
    "mirror": false
  }
}

تعیین نام ماژول

درصورتی که از نام دیگری به‌جز app و app.pyبه‌عنوان نام ماژول اصلی برنامه‌تان استفاده کرده باشید نیاز هست یک فایل با نام liara.json در مسیر اصلی پروژه‌تان ایجاد کرده و به‌شکل زیر ماژول اصلی برنامه‌تان را تعیین کنید:

{
  "flask": {
    "appModule": "FILE_NAME:FLASK_INSTANCE"
  }
}

برای مثال درصورتی که Flask instance با نام app در فایل server.py تعریف کرده باشید:

import os
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def index():
    return render_template('index.html')

باید به‌شکل زیر نام ماژول را در فایل liara.jsonتعیین کنید:

{
  "flask": {
    "appModule": "server:app"
  }
}

تنظیمات TrustedProxies

با توجه به این نکته که تمامی درخواست‌ها توسط Reverse proxy لیارا به برنامه‌ی شما هدایت می‌شود باید در زمان استفاده از فریم‌ورک‌های مختلف برای مشاهده‌ی IP واقعی کاربران و بسیاری از قابلیت‌های دیگر تعیین کنید که برنامه‌ی شما در پشت یک Reverse proxy راه‌اندازی شده است.

from flask import Flask, request
from werkzeug.middleware.proxy_fix import ProxyFix

app = Flask(__name__)

# Use ProxyFix middleware to handle proxy headers
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1)

@app.route('/')
def index():
    # Access client's IP from X-Forwarded-For or X-Real-IP headers
    client_ip = request.headers.get('X-Forwarded-For').split(',')[0] or 
        request.headers.get('X-Real-IP') or 
        request.remote_addr

    return f'Client IP: {client_ip}'

if __name__ == '__main__':
    app.run(debug=True)
;