Skip to main content

python的web mvc框架

项目描述

你好

目录

python的web mvc框架

要求

  • Python:

安装

包上传到PyPI

您可以使用 pip 安装它:

$python3 pip install hallo

文档

中文文档

例子

显示版本

hallo --version

创建项目

hallo create your-project

安装要求

cd your-project
pip install -r requirements.txt

运行项目

python main.py

创建第一个控制器

文件:模块/hello.py

from app.module.base import BaseController

class HelloController(BaseController):

    def world(self):
        return 'hello world'

网址:http: //127.0.0.1/hello/world

创建 json 控制器

文件:模块/json.py

from app.module.base import BaseController

class JsonController(BaseController):

    def this_is_ok(self):
        return self.ok('this is ok')

    def this_is_error(self):
        return self.error('this is error')

网址:http: //127.0.0.1/json/this-is-json

{
    "code": 0,
    "data": "this is ok",
}

网址:http: //127.0.0.1/json/this-is-error

{
    "code": 1,
    "data": "this is error",
}

创建html控制器

文件:模块/html.py

from app.module.base import BaseController

class HtmlController(BaseController):
    
    def index(self):
        return self.render('html/index.html')

网址:http: //127.0.0.1/html/index

<p>hello world!</p>

模型

文件:模型/user.py

from pymyorm.model import Model

class User(Model):
    tablename = 'user'

运行表/模型以反映数据库中的所有模型

python console.py table/model

配置

发展

class DevelopmentConfig(Config):
    ENV = 'development'

测试

class TestingConfig(Config):
    ENV = 'testing'

生产

class ProductionConfig(Config):
    ENV = 'production'

主持人

class Config(object):
    HOST = '127.0.0.1'

港口

class Config(object):
    PORT = 80

服务器名称

class Config(object):
    # domain
    SERVER_NAME = 'hallo.com'

会议

class Config(object):
    # session
    SECRET_KEY = ''
    PERMANENT_SESSION_LIFETIME = timedelta(hours=1)

上传文件

class Config(object):
    # file upload
    MAX_CONTENT_LENGTH = 8 * 1024 * 1024  # 8M

mysql

class Config(object):
    # db: mysql / pgsql
    DB_POOL_SIZE = 1
    DB_CONF = dict(
        source='mysql',
        host='127.0.0.1',
        port=3306,
        user='root',
        password='password',
        database='hallo',
        charset='utf8'
    )

雷迪斯

class Config(object):
    # redis
    REDIS_URL = 'redis://127.0.0.1:6379/0'

内存缓存

class Config(object):
    # cache
    CACHE_CONF = [
        '127.0.0.1:11211'
    ]

oss

class Config(object):
    # oss
    OSS_CONF = dict(
        endpoint='',
        bucket='',
        access_key_id='',
        access_key_secret=''
    )

路由

1、自动路由

http://127.0.0.1/<module>/<controller>/<action>

<module>:模块下的目录或子目录

<控制器>:控制器

<action>:控制器的功能

2、用户自定义路由

文件:app/router.py

router = Router(app=app)
router.add('/hello/<name>', 'hello/hi')

文件:模块/hello.py

from app.module.base import BaseController
class HelloController(BaseController):

    def hi(self, name):
        return f'hi, {name}'

网址:http: //127.0.0.1/hello/jack

hi, jack

3、子域

文件:config.py

class Config(object):
    SERVER_NAME = 'hallo.com'

文件:app/router.py

admin = Router(app=app, subdomain='admin', module='admin')

HTTP 请求

1、得到

文件:模块/http.py

from app.module.base import BaseController

class HttpController(BaseController):
    
    def info(self):
        name = self.get('name')
        age = self.get('age')
        
        return self.ok(dict(
            name=name,
            age=age
        ))

网址: http: //127.0.0.1/http/info ?name=jack&age=18

{
    "name": "jack",
    "age": 18
}

2、发帖

文件:模块/http.py

from app.module.base import BaseController

class HttpController(BaseController):

    def save(self):
        name = self.post('name')
        age = self.post('age')
        
        return self.ok(dict(
            name=name,
            age=age
        ))

网址:http: //127.0.0.1/http/save

{
    "name": "lucy",
    "age": 18
}

3、标题

文件:模块/header.py

from app.module.base import BaseController

class HeaderController(BaseController):

    def token(self):
        token = self.header('Token')
        return self.ok(token)

网址:http: //127.0.0.1/header/token

{
    "code": 0,
    "data": {
        "token": "123456"
    }
}

4、文件

文件:模块/文件/upload.py

from app.module.base import BaseController

class FileController(BaseController):

    def upload(self):
        file = self.file('file')

网址:http: //127.0.0.1/file/upload

mysql

文件:sql/user.sql

create table if not exists `user` (
    `id` int unsigned not null auto_increment,
    `username` varchar(32) not null default '',
    `phone` varchar(16) not null default '',
    `money` decimal(10,2) not null default 0,
    `gender` tinyint unsigned not null default 0,
    `password` varchar(128) not null default '',
    `time` timestamp not null default current_timestamp,
    primary key(`id`),
    unique key `idx_username` (`username`),
    key `idx_phone` (`phone`),
    key `idx_time` (`time`)
) engine=InnoDB default charset=utf8mb4;

1、添加用户

文件:模块/user.py

from app.module.base import BaseController
from app.models.user import User

class UserController(BaseController):

    def add(self):
        username = self.post('username')
        phone = self.post('phone')
        money = self.post('money')
        gender = self.post('gender')

        model = User()
        model.username = username
        model.phone = phone
        model.money = money
        model.gender = gender
        model.save()

        return self.ok()

网址:http: //127.0.0.1/user/add

{
  "code": 0,
  "data": "ok"
}

2、编辑用户

文件:模块/user.py

from app.module.base import BaseController
from app.models.user import User

class UserController(BaseController):

    def edit(self):
        id = self.post('id')
        username = self.post('username')
        phone = self.post('phone')
        money = self.post('money')
        gender = self.post('gender')

        model = User.find().where(id=id).one()
        if not model:
            return self.error('user not exists')
        model.username = username
        model.phone = phone
        model.money = money
        model.gender = gender
        model.save()

        return self.ok()

网址:http: //127.0.0.1/user/edit

{
  "code": 0,
  "data": "ok"
}

3、删除用户

文件:模块/user.py

from app.module.base import BaseController
from app.models.user import User

class UserController(BaseController):

    def delete(self):
        id = self.post('id')
        User.find().where(id=id).delete()
        return self.ok()

网址:http: //127.0.0.1/user/delete

{
  "code": 0,
  "data": "ok"
}

4、列出用户

文件:模块/user.py

from app.module.base import BaseController
from app.models.user import User

class UserController(BaseController):

    def list(self):
        self.init_page()
        model = User.find()
        total = model.count()
        all = model.offset(self.offset).limit(self.limit).all(raw=True)
        return self.resp_page(all, total)

网址:http: //127.0.0.1/user/list

雷迪斯

1套

文件:模块/redis.py

from app.module.base import BaseController

class RedisController(BaseController):

    def mem_set(self):
        try:
            key = self.get('key')
            val = self.get('val')
            self.redis.set(name=key, value=val, ex=3600)
            return self.ok()
        except Exception as e:
            return self.error(str(e))

网址: http: //127.0.0.1/redis/mem-set ?key=name&val=jack

2、得到

文件:模块/redis.py

from app.module.base import BaseController

class RedisController(BaseController):

    def mem_get(self):
        try:
            key = self.get('key')
            val = self.redis.get(key)
            if isinstance(val, bytes):
                return self.ok(val.decode('UTF-8'))
            else:
                return self.error()
        except Exception as e:
            return self.error(str(e))

网址: http: //127.0.0.1/redis/mem-get ?key=name

内存缓存

1套

文件:模块/cache.py

from app.module.base import BaseController

class CacheController(BaseController):

    def mem_set(self):
        key = self.get('key')
        val = self.get('val')
        if self.cache.set(key, val):
            return self.ok()
        else:
            return self.error()

网址: http: //127.0.0.1/cache/mem-set ?key=name&val=lucy

2、得到

文件:模块/cache.py

from app.module.base import BaseController

class CacheController(BaseController):

    def mem_get(self):
        key = self.get('key')
        val = self.cache.get(key)
        if val:
            return self.ok(val)
        else:
            return self.error()

网址: http: //127.0.0.1/cache/mem-get ?key=name

上传文件

1、本地

文件:模块/file.py

from app.module.base import BaseController
from app.helper.file import File

class FileController(BaseController):

    def upload(self):
        file = self.file('file')
        f = File()
        path = f.upload(file)

        resp = dict()
        resp['path'] = path
        return self.ok(resp)

网址:http: //127.0.0.1/file/upload

{
    "code": 0,
    "data": {
        "path": "static/upload/txt/9e/4e/9b/77/9e4e9b7754f8d4a26fc93663d2dae4d6.txt"
    }
}

2、oss

文件:模块/oss.py

from app.module.base import BaseController
from app.helper.oss import Oss

class OssController(BaseController):

    def upload(self):
        file = self.file('file')
        oss = Oss()
        key = oss.upload(file)

        resp = dict()
        resp['key'] = key
        resp['url'] = oss.url(key)
        resp['sign_url'] = oss.sign_url(key=key, expires=3600)
        return self.ok(resp)

网址:http: //127.0.0.1/oss/upload

模板

文件:模块/html.py

from app.module.base import BaseController

class HtmlController(BaseController):

    def index(self):
        tv = dict()
        tv['title'] = 'hello world!'
        return self.render('html/index.html', tv)

网址:http: //127.0.0.1/html/index

安慰

1、内置命令:table

文件:控制台/table.py

显示所有表格

python console.py table/show

创建所有表

python console.py table/build

反映所有表格

python console.py table/model

2、内置命令:secret

文件:控制台/secret.py

生成随机密钥

python console.py secret/key

3、用户自定义命令:test

文件:控制台/test.py

from app.console.base import BaseCommand

class TestCommand(BaseCommand):

    def hello(self):
        print('hello')

运行测试命令

python console.py test/hello

日志

1、应用日志

文件:日志/app.log

2022-07-04 22:12:13 INFO [base.py:28]: flask app init
2022-07-04 22:12:13 INFO [connection_pool.py:36]: put connection into pool
2022-07-04 22:12:13 INFO [_internal.py:224]:  * Running on http://127.0.0.1:80 (Press CTRL+C to quit)

2、控制台日志

文件:日志/console.log

2022-07-04 22:14:33 WARNING [table.py:27]: table user exists

日志格式化程序

文件:helper/functions.py

def  create_log ( log_file ): 
    dictConfig ({ 
        'version' :  1 , 
        'formatters' :  { 
            'default' :  { 
                'format' :  ' %(asctime)s %(levelname)s [ %(filename)s : %(lineno )s ]: %(message)s ' , 'datefmt' : '%Y-%m- %d %H:%M:%S' } }, 'handlers' : { 'wsgi' : { 'class' : 'logging.StreamHandler', 
                 
            
        
         
             
                 
                'stream'  'ext://flask.logging.wsgi_errors_stream','formatter' ' default' },' message' { 'class' 'logging.handlers.RotatingFileHandler' 
                'formatter' 'default' 'filename' log_file 'maxBytes' 1024 * 1024 'backupCount' 10 'encoding' 'utf-8' } },'root' { '级别' '信息'