同时使用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,平时可以暂停使用。

广告
将在 10 秒后关闭
bannerAds