最近一直在填一个玩具式(仅供学习交流,不可用于生产环境)的 WEB 框架的坑,现在大部分功能都已经完成的差不多了, 所以写篇博文介绍一下这个框架。
安装:
pip install bustard pip install psycopg2 # 如果需要 orm 功能
包含的功能:
依赖:
- Python 3.5
- psycopg2
Hello World¶
bustard 参考了 Flask 和 Django 的设计,路由风格跟 Flask 类似采用装饰器风格,view 风格跟 Django 类似采用显示传入 request 的方式。 :
from bustard.app import Bustard
app = Bustard()
@app.route('/')
def helloword(request):
return 'Hello World!'
if __name__ == '__main__':
app.run()
路由¶
支持以下三种方式的路由:
静态路由 :
@app.route('/hello') def hello(request): return 'hello'
类似 Flask 的动态路由(<name>) :
@app.route('/hello/<name>') def hello(request, name): return 'hello {}'.format(name)
类似 Django 的动态路由(正则表达式) :
@app.route('/hello/(?P<name>\w+)') def hello(request, name): return 'hello {}'.format(name)
app.route 支持一个可选参数 methods 用于指定支持的 http method:
@app.route('/', methods=['GET',' POST'])
def hello(request):
return 'hello'
Request¶
request 对象跟 Flask 里的 request 对象类似,常用的方法和属性如下:
- request.headers: url 参数
- request.args: url 参数
- request.form: POST 表单数据(不包含文件)
- request.files: POST 表单里的文件数据
- request.data: POST body
- request.cookies: Cookies
Response¶
response = Response(b'data', status_code=200, content_type='text/html',
headers={'X-Total': 23})
response 对象常用的方法和属性如下:
- response.status_code
- response.content_type
- response.headers
- response.content
- response.set_cookie(...)
- response.delete_cookie(...)
Session¶
访问 request.session 来获取 session 数据,它是一个类 dict 对象`:
user_id = request.session['user_id']
request.session['name'] = 'Tom'
ORM¶
ORM 只支持 postgresql 数据库,用法类似 Django ORM 和 SQLAlchemy 的结合体:
from bustard.orm import (
Model, Engine, Session, AutoField, CharField, BooleanField
)
class User(Model):
__tablename__ = 'users'
id = AutoField(primary_key=True)
username = CharField(max_length=80, index=True)
password = CharField(max_length=200, default='')
is_actived = BooleanField(default=False, server_default=False)
engine = Engine('postgresql://dbuser:password@localhost/exampledb')
session = Session(engine)
新增:
user = User(username='tom', is_actived=False)
session.insert(user)
session.commit()
查询:
session.query(User).filter(User.id > 10)
session.query(User).filter(id=10)
session.query(User).filter(User.id > 10).order_by(User.is_actived)
session.query(User).filter(User.id > 10).limit(3).offset(1)
更新:
session.query(User).filter(User.id > 10).update(is_actived=True)
session.commit()
user.is_actived = True
session.update(user)
session.commit()
删除:
session.query(User).filter(User.id > 10).delete()
session.commit()
session.delete(user)
session.commit()
Comments