使用Laravel风格的Python框架Masonite,结合Django管理界面和React,进行Web应用程序开发,并进行部署到生产环境
上次我们简要介绍了Masonite。这一次我们将深入探讨更实践性的内容。与Laravel的全面比较将在以后进行。
介绍Masonite这个与Laravel非常相似的Python网络框架。
嗯,接下来我们将使用Masonite作为主要框架。作为一直使用Django的我来说,Django的管理界面自动生成和根据模型编写即可生成Schema的思想,比其他任何框架都更方便。
然而,Masonite的优点在于它是与我在工作中使用的Laravel和Rails一样的MVC框架,可以使用Orator从复杂的关系型数据库中获取值,与React、Vue等现代前端技术轻松配合,能够轻松创建Restful控制器等(关于这个主题我会进行深入探讨)。
所以,我们将采用Masonite和Django的组合架构!
确切地说
-
- Djangoでモデルを作る
-
- Djangoでマイグレーションファイルを作る(自動)
-
- Djangoでマイグレートする
-
- Djangoの管理画面を使う
-
- MasoniteでDBアクセス、ルーティング、リクエストとレスポンスのやり取りを行う
- フロント側のファイルはMasoniteのプロジェクト内に作る
我希望用以下的结构来进行。
我们将从Django的管理界面发布网站首页的内容,并使用Masonite获取首页的内容,并将其与由React创建的界面一起返回给客户端。
创建一个项目
構築 anyenv→pyenv→venv→pipenv 的步骤与之前的文章相同。
安装Masonite和Django。
pipenv install masonite-cli django
我要创建Masonite项目。
craft new project
cd project
craft install #依存パッケージがインストールされる
接下来,我们将创建一个Django项目。
如果使用Mysql或Pgsql等关系数据库,Django和Masonite都会通过套接字连接到关系数据库,因此即使并行创建多个项目也没有问题。但是,这次我们使用Sqlite,所以我们将在Masonite中创建一个名为”admin”的目录作为Django项目的一部分。
django-admin startproject admin
cd admin
python manage.py startapp my_site
我认为当前的目录结构应该如下所示。
project ←Masoniteのプロジェクト
admin ←Djangoのプロジェクト
admin
setting.py
urls.py
wsgi.py
my_site
migrations
admin.py
app.py
models.py
test.py
views.py
manage.py
app
bootstrap
config
databases
resources
routes
storagetest
.env
wsgi.py
Django
制作模型
现在我们开始项目设计。我们将使用Django来创建模型。
from django.db import models
class Toppage(models.Model):
def __str__(self):
return str(self.title)
title = models.CharField(max_length=255)
article = models.TextField(blank=True, null=True)
class Meta:
db_table = 'toppage'
verbose_name_plural = 'toppage'
当Django进行迁移时,会根据应用的名称添加前缀来命名表。为了防止这种情况发生,可以通过在class Meta中设置db_table来进行设置。
verbose_name_plural用于表示复数形式的表名,在管理网站中会显示这个表名。
def __str__(self):
return str(self.title)
这也是Django管理网站中的一部分,用来正确设置显示在表格内的列名。
我的迁移
为了让Django识别对my_site模型的更改,需要编辑setting.py文件。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'my_site', #←追加
]
我会移民到中国。
cd /project/admin
python manage.py makemigrations
python manage.py migrate
自动检测模型更改并创建迁移文件!!!非常方便!!!
创建一个管理员用户,并启动Django后,管理网站将会打开。
python manage.py createsuperuser
python manage.py runserver
回应
我們將使用React來構建前端。這次只是輕鬆地在Masonite中。
在Masonite中,視圖文件將被創建在/project/resources/templates文件夾中,通過執行create-react-app命令,我們可以在其中保持MVC的形式並創建React項目。當然,我認為您也可以通過”vue create”來完成相同的操作。
cd /project/resources/templates
npm install yarn
yarn add global create-react-app
create-react-app my_site
cd my_site
yarn add axios
在App.js中,我们将创建一个与服务器和API通信的处理程序,并在屏幕上显示相应内容。
import React, { Component } from 'react';
import axios from 'axios';
export default class App extends Component {
state = {
toppage: '',
}
getToppage=()=>{
axios.get('/my-site/api/get_toppage')
.then(response=>{
this.setState({
toppage: response.toppage;
})
})
.catch(e=>{
console.error('通信エラー');
})
}
componentDidMount(){
this.getToppage();
}
render(){
return(
<div>
{this.state.toppage}
</div>
);
}
}
进行编译
yarn build
当然地,在编译后的文件将被创建在 “/project/resources/templates/my_site/build/” 目录下。
初步设置当Masonite收到对 “/static” 的访问时,将查找 “/project/resources/templates/my_site/build/static/” 目录。
稍后将发送 index.html 文件。
STATICFILES = {
# folder # template alias
'resources/templates/my_site/build/static': 'static/', #←追加
'storage/static': 'static/',
'storage/compiled': 'static/',
'storage/uploads': 'static/',
'storage/public': '/',
}
马森板
我们从这里开始使用Masonite来创建MVC。
首先,让我们将Django创建的/project/admin/db.sqlite3文件编辑成Masonite可以读取的格式。我们要编辑.env文件。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=masonite
DB_USERNAME=root
DB_PASSWORD=root
DB_LOG=True
-> 照下面的这个原文自然地用中文进行改写,只需要提供一种选项:
↓
DB_CONNECTION=sqlite
DB_DATABASE=admin/db.sqlite3
DB_LOG=True
制作模型 (Zhì zuò
我会使用Masonite来制作模型。
cd /project
craft model models/Topppage
我将创建一个将主页内容返回给控制器的方法。
from config.database import Model
class Toppage(Model):
__table__ = 'toppage'
@staticmethod
def get_toppage():
return Toppage \
.select(
'title',
'article'
) \
.find(1) \
.serialize()
通过设置「__table__ = ‘toppage’」,Masonite会访问名为toppage的表。
Masonite采用的Python ActiveRecord框架Orator的规范是,如果不加上serialize(),则可以作为类获取,加上则可以作为字典获取。
制作一个控制器
craft controller Toppage
将会创建 /project/app/http/controllers/ToppageController.py 文件。
我们要创建一个方法,该方法对应于返回 HTML 的路由,并返回主页内容的 API。
from app.models.Toppage import Toppage
class ToppageController:
def show(self):
return view('my_site/build/index.html')
def get_toppage(self):
toppage = Toppage.get_toppage()
return {'toppage': toppage}
控制器的view方法会自动设置为查找“/project/resources/templates/”这个路径。
创建路由
我将创建支持返回HTML的路由和返回首页内容的API路由。
from masonite.helpers.routes import get
from app.http.controllers.ToppageController import ToppageController
ROUTES = [
get('/', ToppageController.show),
get('/my-site/api/get_toppage', ToppageController.get_toppage)
]
服务器端处理已经完成。
基础设施
从这里开始进行服务器的设置。
由于服务器上预装的Python版本可能过旧,或者您可能希望使用自己喜欢的版本,因此建议按照同样的顺序进行环境设置:anyenv→pyenv→venv→pipenv。
首先, 我们来配置Django的静态文件发布。
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'templates/static')
让我们将静态文件全部放到用于发布的目录中。可以使用Django的内置命令。
python manage.py collectstatic
Nginx – nginx
我们来安装Nginx。
apt install nginx
在完成安装后,当访问服务器的IP地址的80号端口时,我认为应该能看到“Welcome Nginx!”页面。
– 当访问“/admin”时,会进入Django的管理界面。
– 当访问“/static/admin”时,会加载Django管理界面所使用的静态文件。
– 其他访问会由Masonite进行处理。
我們將在文件的http設定中進行配置。
upstream django {
server unix:///var/run/django.sock;
}
upstream masonite {
server unix:///var/run/masonite.sock;
}
server {
listen 80;
server_name my_site.com;
location /static/admin {
alias /path/to/your/site/project/admin/templates/static/admin;
}
location /admin {
uwsgi_pass django;
include /path/to/your/site/project/admin/uwsgi_params;
}
location / {
uwsgi_pass masonite;
include /path/to/your/site/project/project/uwsgi_params;
}
}
由于/etc/nginx/目录中存在一个名为uwsgi_params的文件,因此让我们将其分别复制到Masonite和Django的项目根目录中。
cp /etc/nginx/uwsgi_params /path/to/your/site/project/project/
cp /etc/nginx/uwsgi_params /path/to/your/site/project/project/admin
uWSGI
uWSGI和gunicorn都是常用的Python应用服务器,用于Python的生产环境。
首先,要安装uwsgi。
pipenv install uwsgi
我会创建一个写有uwsgi配置的ini文件。
[uwsgi]
socket = /var/run/django.sock
#permissions for the socket file
chmod-socket = 666
#application's base folder
base = /path/to/your/site/project/admin
#python module to import
module = admin.wsgi
processes = 2
threads = 1
[uwsgi]
socket = /var/run/masonite.sock
#permissions for the socket file
chmod-socket = 666
#application's base folder
base = /path/to/your/site/project
#python module to import
module = wsgi
processes = 2
threads = 1
启动服务的方法是使用类似于pip的uwsgi命令来启动由Python编写的应用程序。因此,Masonite应在/project目录下启动,而Django应在/project/admin目录下启动。建议使用启动批处理来完成这个任务。
可以使用nohup和&命令,在后台运行应用程序。
#!/bin/bash
service nginx restart
nohup uwsgi --ini masonite.ini > /dev/null 2>&1 &
#!/bin/bash
nohup uwsgi --ini django.ini > /dev/null 2>&1 &
当服务停止时
killall uwsgi
让我们启动服务吧!请务必激活venv。
cd /path/to/your/site/
source .venv/bin/activate # venvを有効にしないとuwsgiにパスが通らない
cd project/
./run.sh
cd admin/
./run.sh
通过浏览器访问服务器上的”/admin”,即可打开Django的管理界面;通过访问”/”,可以打开由React创建的界面;如果在Django管理界面上发布的内容被Masonite传送并显示在屏幕上,则表示成功。
最后
这次我们一口气向您解释了使用Django的管理界面和Masonite进行服务运维的步骤,与现代前端技术的协作,以及直到生产部署为止的过程。希望通过这次机会,您能够意识到使用Python进行web开发的乐趣和高效性,并且希望Pythonista们也能试试Masonite!非常感谢您。