同时使用Django和Flask
Django和Flask是用于构建Python的Web服务的框架。
Flask虽然简单易用,但涉及到数据库时,我希望能使用Django方便的管理后台界面。
我找到了这篇文章。平时我只启动Flask的API服务器,只有在想要操作数据库时才想尝试启动Django。
重要文件
- Ubuntu
搭建环境。
$ sudo apt install virtualenv
$ virtualenv env -p python3
$ source env/bin/activate
$ pip install django flask
Django建构
$ django-admin startproject djangoflask
$ ./manage.py migrate
$ ./manage.py createsuperuser
请确认启动。使用以下命令启动测试服务器,并在http://127.0.0.1:8000/admin上访问管理界面进行确认。
$ ./manage.py runserver
添加应用程序。
$ django-admin startapp flaskapp
INSTALLED_APPS = [
...
'flaskapp',
]
随便尝试制作一个模型的例子。
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100, default='')
body = models.TextField(max_length=500, default='')
def __str__(self):
return self.title
$ ./manage.py makemigrations flaskapp
$ ./manage.py migrate
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
pass
可以通过管理界面访问并编辑文章吗?
用于创建网站的一个轻量级Python框架是Flask。
在代码的开头进行一些处理,以便能够使用Django的模型类。
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoflask.settings")
from django.apps import apps
from django.conf import settings
apps.populate(settings.INSTALLED_APPS)
from flask import Flask, jsonify
from .models import Post
def create_app():
app = Flask(__name__)
return app
app = create_app()
@app.route('/')
def index():
return "THIS IS FLASK INDEX PAGE."
@app.route('/<int:post_id>')
def post(post_id):
post = Post.objects.filter(id=post_id).values().first()
return jsonify(post)
尝试通过运行 $ ./manage.py runserver 命令来启动 Django 测试服务器,然后再试着通过运行 $ ./manage.py flask 命令来启动 Flask 测试服务器。
#!/usr/bin/env python
import os
import sys
def exec_django():
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoflask.settings")
if len(sys.argv) > 1 and sys.argv[1] == "flask":
from flaskapp.flask import app
app.run()
else:
exec_django()
请运行Flask测试服务器,并尝试在http://127.0.0.1:5000/1上访问Post数据。
$ ./manage.py flask
在另一个终端上,我能够同时运行Django的测试服务器并以不同的端口打开数据库管理界面以及访问API服务器吗?
准备生产服务器(nginx+uWSGI)
使用nginx和uWSGI来发布本番服务器。
$ sudo apt install nginx
$ pip install uwsgi
如果在安装uWSGI时出现Exception: you need a C compiler to build uWSGI的错误提示,那么可以尝试以下解决方案:
$ sudo apt install build-essential
如果在安装uWSGI时出现致命错误:Python.h:没有这样的文件或目录,则
sudo apt install python3-dev
创建启动文件。
[uwsgi]
module = djangoflask.wsgi:application
master = true
processes = 1
socket = /tmp/django_uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true
[uwsgi]
module = flaskapp.flask:app
master = true
processes = 1
socket = /tmp/flask_uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true
添加設定。
...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
nginx配置。
server {
listen 80;
listen [::]:80;
server_name example.wakin.site;
location / {
include uwsgi_params;
uwsgi_pass unix:///tmp/flask_uwsgi.sock;
}
location /admin {
include uwsgi_params;
uwsgi_pass unix:///tmp/django_uwsgi.sock;
}
location /static/ {
alias /path/to/djangoflask/static/;
}
}
重新启动nginx
$ sudo systemctl restart nginx
启动并访问每一个主要服务器。
$ uwsgi --ini django_uwsgi.ini
$ uwsgi --ini flask_uwsgi.ini
只要能够访问,首先标题问题就完成了。
上司变成了妖怪
将本番服务器启动变为守护进程。
$ sudo apt install supervisor
创建设置文件。
[program:django] ; プロセスの名前
directory=/path/to/djangoflask ; 作業ディレクトリ
command=/path/to/env/bin/uwsgi --ini django_uwsgi.ini ; 起動コマンド
numprocs=1 ; 起動インスタンス数?
autostart=true ; autostartする
autorestart=true ; 自動で再起動させる
user=*** ; 起動ユーザ
redirect_stderr=true ; 標準エラーを出力する
stdout_logfile=/var/log/supervisor/django.log ; ログファイルの出力先
[program:flask] ; プロセスの名前
directory=/path/tp/djangoflask ; 作業ディレクトリ
command=/path/to/env/bin/uwsgi --ini flask_uwsgi.ini ; 起動コマンド
numprocs=1 ; 起動インスタンス数?
autostart=true ; autostartする
autorestart=true ; 自動で再起動させる
user=*** ; 起動ユーザ
redirect_stderr=true ; 標準エラーを出力する
stdout_logfile=/var/log/supervisor/flask.log ; ログファイルの出力先
重新加载配置文件。
$ sudo supervisorctl reload
确认进程。
$ sudo supervisorctl status
当你要停下来时,
$ sudo supervisorctl stop <プロセス名>
只需要一种选择:开始运行时,
$ sudo supervisorctl start <プロセス名>
访问日志等会被写入到/var/log/supervisor/*.log中。
只在需要打开数据库管理页面时启动django,平时可以暂停使用。