Spaces:
Build error
Build error
# setup_and_run_fastapi.ps1 | |
<# | |
هدف: | |
- ایجاد محیط مجازی (venv) | |
- نصب fastapi و uvicorn | |
- نوشتن main.py با API پایه (در صورت نبود) | |
- اجرای uvicorn در یک پنجره جدید (اختیاری) | |
- تست سریع با Invoke-RestMethod (در صورت نیاز) | |
نحوه اجرا: | |
- PowerShell را با دسترسی مناسب باز کن (برای اجرای این اسکریپت نیاز به Policy مناسب داری) | |
- اجرا: .\setup_and_run_fastapi.ps1 -Port 8000 -Host 0.0.0.0 -AutoRun | |
- یا بدون AutoRun: .\setup_and_run_fastapi.ps1 | |
#> | |
<# | |
پارامترها | |
-Port: پورت سرور (default 8000) | |
-Host: آدرس میزبانی (default 0.0.0.0) | |
-AutoRun: اگر حضور باشد، uvicorn در یک پنجرهٔ جدید اجرا میشود | |
#> | |
param( | |
[string]$Port = "8000", | |
[string]$Host = "0.0.0.0", | |
[string]$ProjectDir = (Get-Location).Path, | |
[switch]$AutoRun | |
) | |
$ErrorActionPreference = "Stop" | |
try { | |
Write-Host "شروع فرآیند آمادهسازی در پوشه: $ProjectDir" | |
# بررسی وجود پایتون در PATH | |
$pyCmd = Get-Command python -ErrorAction SilentlyContinue | |
if (-not $pyCmd) { | |
Write-Error "Python در PATH شما پیدا نشد. لطفاً Python 3.13.7+ را نصب کرده و در PATH قرار بده." | |
exit 1 | |
} | |
Write-Host "Python ورژن: $(python --version 2>&1)" | |
$venvPath = Join-Path -Path $ProjectDir -ChildPath "venv" | |
# ایجاد venv در صورت نبود | |
if (-Not (Test-Path $venvPath)) { | |
Write-Host "در حال ایجاد محیط مجازی (venv) ..." | |
& python -m venv $venvPath | |
} else { | |
Write-Host "محیط مجازی قبلاً وجود دارد." | |
} | |
$venvPython = Join-Path -Path $venvPath -ChildPath "Scripts\python.exe" | |
# اطمینان از وجود پکیجها | |
Write-Host "ارتقاء pip و نصب وابستگیها..." | |
& $venvPython -m pip install --upgrade pip | |
& $venvPython -m pip install fastapi uvicorn | |
# اضافه کردن main.py اگر وجود ندارد | |
$mainPath = Join-Path -Path $ProjectDir -ChildPath "main.py" | |
if (-Not (Test-Path $mainPath)) { | |
$mainContent = @" | |
from fastapi import FastAPI | |
from pydantic import BaseModel | |
app = FastAPI() | |
class GenerateRequest(BaseModel): | |
prompt: str | |
@app.post("/generate") | |
async def generate(req: GenerateRequest): | |
return {"received_prompt": req.prompt, "status": "ok"} | |
@app.get("/status") | |
async def status(): | |
return {"status": "running"} | |
"@ | |
Set-Content -Path $mainPath -Value $mainContent -Encoding UTF8 | |
Write-Host "main.py ایجاد شد در: $mainPath" | |
} else { | |
Write-Host "main.py وجود دارد. از آن استفاده میشود." | |
} | |
# اجرای uvicorn | |
if ($AutoRun) { | |
Write-Host "در حال اجرای uvicorn در پنجرهٔ جدید..." | |
$args = @("-m","uvicorn","main:app","--reload","--port",$Port,"--host",$Host) | |
Start-Process -FilePath $venvPython -ArgumentList $args -WindowStyle Normal -WorkingDirectory $ProjectDir | |
Start-Sleep -Seconds 3 | |
# تست ساده بعد از راهاندازی | |
$maxWait = 15 | |
$t = 0 | |
$ready = $false | |
while (-not $ready -and $t -lt $maxWait) { | |
try { | |
$resp = Invoke-RestMethod -Uri "http://localhost:$Port/status" -ErrorAction Stop | |
$ready = $true | |
Write-Host "API در دسترس است: وضعیت -> $($resp.status)" | |
} catch { | |
Start-Sleep -Seconds 1 | |
$t++ | |
} | |
} | |
if (-not $ready) { | |
Write-Host "تست Startup به صورت کامل انجام نشد. میتوانید به صورت دستی به پورت $Port مراجعه کنید." | |
} | |
} else { | |
Write-Host "برای اجرای سرور از این دستور استفاده کن (در همان پوشه):" | |
Write-Host " `"$venvPython`" -m uvicorn main:app --reload --port $Port --host $Host" | |
} | |
Write-Host "تمام شد. با موفقیت آماده است." | |
Write-Host "docs: http://localhost:$Port/docs" | |
} catch { | |
Write-Error "خطا در اجرای اسکریپت: $_" | |
} |