Hallo
web mvc framework for python
Install / Use
/learn @oldjun/HalloREADME
Hallo
Table of Contents
web mvc framework for python
<a href=#requirements>Requirements</a>
- Python:
- CPython: 3.6 or newer
<a href=#installation>Installation</a>
Package is uploaded on PyPI.
You can install it with pip:
$python3 pip install hallo
<a href=#documentation>Documentation</a>
中文文档.
<a href=#example>Example</a>
show version
hallo --version
create project
hallo create your-project
install requirements and run project
cd your-project
hallo install
create first controller
file: module/hello.py
from app.module.base import BaseController
class HelloController(BaseController):
def world(self):
return 'hello world'
url: http://127.0.0.1/hello/world
create json controller
file: module/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')
url: http://127.0.0.1/json/this-is-json
{
"code": 0,
"data": "this is ok",
}
url: http://127.0.0.1/json/this-is-error
{
"code": 1,
"data": "this is error",
}
create html controller
file: module/html.py
from app.module.base import BaseController
class HtmlController(BaseController):
def index(self):
return self.render('html/index.html')
url: http://127.0.0.1/html/index
<p>hello world!</p>
model
file: models/user.py
from pymyorm.model import Model
class User(Model):
tablename = 'user'
run table/model to reflect all model from database
python console.py table/model
config
development
class DevelopmentConfig(Config):
ENV = 'development'
testing
class TestingConfig(Config):
ENV = 'testing'
production
class ProductionConfig(Config):
ENV = 'production'
host
class Config(object):
HOST = '127.0.0.1'
port
class Config(object):
PORT = 80
server name
class Config(object):
# domain
SERVER_NAME = 'hallo.com'
session
class Config(object):
# session
SECRET_KEY = ''
PERMANENT_SESSION_LIFETIME = timedelta(hours=1)
file upload
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'
)
redis
class Config(object):
# redis
REDIS_URL = 'redis://127.0.0.1:6379/0'
memcache
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=''
)
routing
1、auto routing
http://127.0.0.1/<module>/<controller>/<action>
<module>: the directory or subdirectory under module
<controller>: the controller
<action>: the function of controller
2、user defined routing
file: app/router.py
router = Router(app=app)
router.add('/hello/<name>', 'hello/hi')
file: module/hello.py
from app.module.base import BaseController
class HelloController(BaseController):
def hi(self, name):
return f'hi, {name}'
url: http://127.0.0.1/hello/jack
hi, jack
3、subdomain
file: config.py
class Config(object):
SERVER_NAME = 'hallo.com'
file: app/router.py
admin = Router(app=app, subdomain='admin', module='admin')
HTTP request
1、get
file: module/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
))
url: http://127.0.0.1/http/info?name=jack&age=18
{
"name": "jack",
"age": 18
}
2、post
file: module/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
))
url: http://127.0.0.1/http/save
{
"name": "lucy",
"age": 18
}
3、header
file: module/header.py
from app.module.base import BaseController
class HeaderController(BaseController):
def token(self):
token = self.header('Token')
return self.ok(token)
url: http://127.0.0.1/header/token
{
"code": 0,
"data": {
"token": "123456"
}
}
4、file
file: module/file/upload.py
from app.module.base import BaseController
class FileController(BaseController):
def upload(self):
file = self.file('file')
url: http://127.0.0.1/file/upload
mysql
file: 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、add user
file: module/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()
url: http://127.0.0.1/user/add
{
"code": 0,
"data": "ok"
}
2、edit user
file: module/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()
url: http://127.0.0.1/user/edit
{
"code": 0,
"data": "ok"
}
3、delete user
file: module/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()
url: http://127.0.0.1/user/delete
{
"code": 0,
"data": "ok"
}
4、list user
file: module/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)
url: http://127.0.0.1/user/list
redis
1、set
file: module/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))
url: http://127.0.0.1/redis/mem-set?key=name&val=jack
2、get
file: module/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))
url: http://127.0.0.1/redis/mem-get?key=name
memcache
1、set
file: module/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()
url: http://127.0.0.1/cache/mem-set?key=name&val=lucy
2、get
file: module/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()
url: http://127.0.0.1/cache
