๐ฏ ๅ่จ
่ฟ็ฏๆ็จ่ฏฆ็ป่ฎฒ่งฃๅฆไฝๆ Django REST Framework ๅ็ซฏ้จ็ฝฒๅฐ PythonAnywhereใ
PythonAnywhere ๅ
่ดนๅฅ้คๆฏๆ Python Web ๅบ็จๆ็ฎก๏ผๅ็ๆฏๆ Django๏ผๆ ้ๆๅกๅจ่ฟ็ปด๏ผ้ๅธธ้ๅไธชไบบ้กน็ฎใ
๐ ๅๅคๅทฅไฝ
๐๏ธ ๆดไฝๆต็จ
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
โ ๆฌๅฐๅผๅ โโโโโโถโ GitHub โโโโโโถโ Python โ
โ Django ้กน็ฎ โ โ ๆ็ฎกไปฃ็ โ โ Anywhere โ
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
๐ ็ฌฌไธๆญฅ๏ผๅๅค้กน็ฎ
1.1 ็กฎ่ฎค้กน็ฎ็ปๆ
ไธไธชๆ ๅ็ Django ้กน็ฎๅบ่ฏฅ็ฑปไผผ่ฟๆ ท๏ผ
backend/
โโโ blog_api/ # Django ้กน็ฎ้
็ฝฎ
โ โโโ settings.py # ๆ ธๅฟ้
็ฝฎๆไปถ
โ โโโ urls.py # ไธป่ทฏ็ฑ
โ โโโ wsgi.py # WSGI ๅ
ฅๅฃ
โโโ articles/ # ไฝ ็ App
โ โโโ models.py
โ โโโ views.py
โ โโโ serializers.py
โโโ manage.py
โโโ requirements.txt # Python ไพ่ตๅ่กจ
โโโ venv/ # ๆฌๅฐ่ๆ็ฏๅข
1.2 ็ๆ requirements.txt
cd backend
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
# ๅป็ปๅฝๅๆๆไพ่ต
pip freeze > requirements.txt
# ็กฎ่ฎคๆไปถๅ
ๅฎนๅ
ๅซ่ฟไบๅ
ณ้ฎๅ
cat requirements.txt | grep -E "django|rest_framework|simplejwt|corsheaders"
1.3 ็ไบง็ฏๅข้
็ฝฎ
ไฟฎๆน backend/blog_api/settings.py๏ผ่ฎฉ้
็ฝฎไป็ฏๅขๅ้่ฏปๅ๏ผ
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
# โ
ไป็ฏๅขๅ้่ฏปๅ๏ผๆ้ป่ฎคๅผไฟๅบ
SECRET_KEY = os.environ.get(
'DJANGO_SECRET_KEY',
'django-insecure-dev-key-change-me'
)
DEBUG = os.environ.get('DEBUG', 'True') == 'True'
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '*').split(',')
# โ
CORS ้
็ฝฎ๏ผ็ไบง็ฏๅขๆๅฎๅๅ
_cors = os.environ.get('CORS_ALLOWED_ORIGINS', '')
if _cors:
CORS_ALLOWED_ORIGINS = [o.strip() for o in _cors.split(',') if o.strip()]
CORS_ALLOW_ALL_ORIGINS = False
else:
CORS_ALLOW_ALL_ORIGINS = True # ๅผๅ็ฏๅขๅ
่ฎธๆๆๆฅๆบ
# โ
้ๆๆไปถ
STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
# โ
ๅชไฝๆไปถ
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
1.4 ๆจ้ไปฃ็ ๅฐ GitHub
git add backend/
git commit -m "chore: production-ready Django config"
git push origin master
๐ฅ๏ธ ็ฌฌไบๆญฅ๏ผ็ปๅฝ PythonAnywhere
2.1 ๆๅผ Bash ๆงๅถๅฐ
็ปๅฝ pythonanywhere.com โ Dashboard โ ็นๅป Bash๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PythonAnywhere Dashboard โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ [ Files ] [ Web ] [ Databases ] [ Bash ] [...] โ
โ โ
โ ็นๅป Bash ๆๅผๅฝไปค่ก็ป็ซฏ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
2.2 ๅ
้ไปฃ็
# ๅ
้ไฝ ็ไปๅบ
git clone https://github.com/YOUR_USERNAME/YOUR_REPO.git
cd YOUR_REPO/backend
# ็กฎ่ฎคๆไปถ้ฝๅจ
ls -la
๐ ็ฌฌไธๆญฅ๏ผๅๅปบ่ๆ็ฏๅข
3.1 ๅๅปบ venv
# PythonAnywhere ๆฏๆ Python 3.10 / 3.11 / 3.12
python3.12 -m venv venv
# ๆฟๆดป่ๆ็ฏๅข
source venv/bin/activate
# ไฝ ไผ็ๅฐๅฝไปค่กๅ้ขๅบ็ฐ (venv) ๆ ่ฏ
3.2 ๅฎ่ฃ
ไพ่ต
pip install -r requirements.txt
โ ๏ธ ๅฆๆๅฎ่ฃ
ๅคฑ่ดฅ๏ผๆฃๆฅ requirements.txt ๆฏๅฆๅ
ๅซไธๅ
ผๅฎน็ๅ
ใๅฏไปฅๅ
ๆๅจๅฎ่ฃ
ๆ ธๅฟๅ
๏ผ
bash
pip install django djangorestframework djangorestframework-simplejwt django-cors-headers
3.3 ็ๆ็ไบงๅฏ้ฅ
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
๐ ๆ่ฟไธช็ๆ็ๅฏ้ฅๅคๅถไฟๅญๅฅฝ๏ผไธไธๆญฅ่ฆ็จ๏ผ
โ๏ธ ็ฌฌๅๆญฅ๏ผๅๅปบ Web App
4.1 ๆทปๅ Web App
ๅๅฐ Dashboard โ Web ๆ ็ญพ โ ็นๅป Add a new web app๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Create new web app โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โ Choose Manual configuration (not Django/Flask) โ
โ [Next] โ
โ โ
โ โ Select Python 3.12 [Next] โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๏ธ ๆณจๆ๏ผ้ Manual configuration๏ผไธ่ฆ้ Django ่ชๅจ้
็ฝฎ๏ผ
4.2 ้
็ฝฎ Web App
ๅๅปบๅฎๆๅ๏ผไฝ ไผ็ๅฐ้
็ฝฎ้กต้ขใไพๆฌกๅกซๅ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Source code: โ
โ /home/ไฝ ็็จๆทๅ/YOUR_REPO/backend โ
โ โ
โ Working directory: โ
โ /home/ไฝ ็็จๆทๅ/YOUR_REPO/backend โ
โ โ
โ Virtualenv: โ
โ /home/ไฝ ็็จๆทๅ/YOUR_REPO/backend/venv โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
4.3 ้
็ฝฎ WSGI ๆไปถ
็นๅป่่ฒ็ WSGI configuration file ้พๆฅ๏ผๆๅ
ๅฎนๅ
จ้จๆฟๆขไธบ๏ผ
import os
import sys
# ่ฎพ็ฝฎ้กน็ฎ่ทฏๅพ
path = '/home/YOUR_USERNAME/YOUR_REPO/backend'
if path not in sys.path:
sys.path.insert(0, path)
# ่ฎพ็ฝฎ็ฏๅขๅ้๏ผๆๅฏ้ฅๆขๆ็ฌฌๅๆญฅ็ๆ็๏ผ๏ผ
os.environ['DJANGO_SETTINGS_MODULE'] = 'blog_api.settings'
os.environ['DJANGO_SECRET_KEY'] = 'ไฝ ็็ไบงๅฏ้ฅ'
os.environ['DEBUG'] = 'False'
os.environ['ALLOWED_HOSTS'] = 'ไฝ ็็จๆทๅ.pythonanywhere.com'
os.environ['CORS_ALLOWED_ORIGINS'] = 'https://ไฝ ็็จๆทๅ.github.io'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
โ ๏ธ ๆ YOUR_USERNAME ๅ YOUR_REPO ๆฟๆขๆไฝ ่ชๅทฑ็ๅผ๏ผ
ไฟๅญๅๅ
ณ้ญ็ผ่พๅจใ
๐๏ธ ็ฌฌไบๆญฅ๏ผๅๅงๅๆฐๆฎๅบ
5.1 ่ฟ่ก่ฟ็งป
ๅๅฐ Bash ็ป็ซฏ๏ผ
cd ~/YOUR_REPO/backend
source venv/bin/activate
# ่ฟ่กๆๆๆฐๆฎๅบ่ฟ็งป
python manage.py migrate
# ไฝ ๅบ่ฏฅ็ๅฐ็ฑปไผผ่พๅบ๏ผ
# Operations to perform:
# Apply all migrations: articles, comments, ...
# Running migrations:
# Applying articles.0001_initial... OK
# ...
5.2 ๅๅปบ็ฎก็ๅ่ดฆๅท
python manage.py createsuperuser
ๆๆ็คบ่พๅ
ฅ๏ผ
Username: admin
Email address: your@email.com
Password: ********
Password (again): ********
Superuser created successfully.
5.3 ๆถ้้ๆๆไปถ
python manage.py collectstatic --noinput
# ่พๅบ: 157 static files copied to 'staticfiles'
๐ ็ฌฌๅ
ญๆญฅ๏ผ้
็ฝฎ้ๆๆไปถๆ ๅฐ
ๅๅฐ Web ้กต้ข๏ผๆพๅฐ Static Files ๅบๅ๏ผๆทปๅ ไธค่ก๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Static Files โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ URL โ Directory โ
โโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ /static/ โ /home/xxx/YOUR_REPO/backend/ โ
โ โ staticfiles โ
โโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ /media/ โ /home/xxx/YOUR_REPO/backend/ โ
โ โ media โ
โโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ ็ฌฌไธๆญฅ๏ผๅฏๅจ๏ผ
7.1 ้่ฝฝ Web App
ๅๅฐ Web ้กต้ข้กถ้จ๏ผ็นๅป็ปฟ่ฒ Reload ๆ้ฎ๏ผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Web App Status โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
Running [ Reload ] โ
โ โ
โ Your site: https://YOUR_USERNAME.pythonanywhere.com โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
7.2 ้ช่ฏ API
ๆๅผๆต่งๅจ่ฎฟ้ฎ๏ผ
https://ไฝ ็็จๆทๅ.pythonanywhere.com/api/articles/
ๅฆๆ็ๅฐ JSON ๆฐๆฎ๏ผๆญๅ้จ็ฝฒๆๅ๏ผ๐
โ ๏ธ ๅธธ่ง้ฎ้ข
Q1: ๆๅผ็ฝ็ซๆพ็คบ "Something went wrong"
ๆฅ็้่ฏฏๆฅๅฟ๏ผWeb โ Error log๏ผๆ นๆฎๅ
ทไฝ้่ฏฏๆๆฅใ
ๅธธ่งๅๅ ๏ผ
- WSGI ๆไปถ่ทฏๅพๅ้ไบ
- ่ๆ็ฏๅขๆฒก่ฃ
ไพ่ต
- ๅฏ้ฅๆฒกๆ่ฎพ็ฝฎ
Q2: ๆฐๆฎๅบ่ฟ็งปๆฅ้
็กฎ่ฎคๅทฒๆฟๆดป่ๆ็ฏๅข๏ผsource venv/bin/activate
Q3: ้ๆๆไปถ 404
ๆฃๆฅ Static Files ๆ ๅฐ้
็ฝฎ๏ผURL ๅ Directory ่ฆๅฎๅ
จๅน้
ใ
Q4: CORS ้่ฏฏ๏ผๆต่งๅจๆงๅถๅฐ๏ผ
ๆฃๆฅ WSGI ๆไปถไธญ็ CORS_ALLOWED_ORIGINS ๆฏๅฆๅ
ๅซไฝ ็ๅ็ซฏๅๅใ
Q5: ไฟฎๆนไปฃ็ ๅไธ็ๆ
ๆฏๆฌกไฟฎๆนไปฃ็ ๅๅฟ
้กป็นๅป Reload๏ผ
# ๆดๆฐไปฃ็ ็ๆ ๅๆต็จ๏ผ
cd ~/YOUR_REPO/backend
git pull # ๆๅๆๆฐไปฃ็
source venv/bin/activate
pip install -r requirements.txt # ๅฎ่ฃ
ๆฐไพ่ต๏ผๅฆๆๆ๏ผ
python manage.py migrate # ่ฟ่กๆฐ่ฟ็งป๏ผๅฆๆๆ๏ผ
python manage.py collectstatic --noinput
# ็ถๅๅป Web ้กต้ข็น Reload
๐ ้จ็ฝฒๆต็จๅพ
ๆฌๅฐๅผๅ GitHub PythonAnywhere Browser
โโโโโโโโ โโโโโโโโ โโโโโโโโโโโโ โโโโโโโโ
โ ๅไปฃ็ โโโpushโโโถโ ไปๅบ โโโcloneโโโถโ Bash ็ป็ซฏ โ โ ่ฎฟ้ฎ โ
โโโโโโโโ โโโโโโโโ โโโโโโฌโโโโโโ โโโโฌโโโโ
โ โ
โโโโโโผโโโโโโ โ
โ venv โ โ
โ pip โ โ
โ migrate โ โ
โ collect โ โ
โโโโโโฌโโโโโโ โ
โ โ
โโโโโโผโโโโโโ โโโโโโผโโโโโ
โ Web App โโโโโถโ HTTPS โ
โ WSGI โ โ 200 OK โ
โ Reload โ โโโโโโโโโโโ
โโโโโโโโโโโโ
โ
้จ็ฝฒๆฃๆฅๆธ
ๅ
๐ ๅ่้พๆฅ