python的web mvc框架
项目描述
你好
目录
python的web mvc框架
要求
- Python:
- CPython:3.6 或更高版本
安装
包上传到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' :{ '级别' :'信息' ,