使用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!非常感谢您。

广告
将在 10 秒后关闭
bannerAds