一、数据准备
事先建立好mysql数据和插入数据,我使用图形化界面创建数据库和插入数据
如果希望用mysql的gui工具推荐
MySQL 的 GUI 工具-Navicat
http://download.csdn.net/download/su749520/10192264
二、MVC 核心代码
1.界面
file:///D:/python3-webapp-Su/www/templates/home.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test users - Python Webapp</title>
</head>
<body>
<h1>All users</h1>
{% for u in users %}
<p>{{ u.name }} / {{ u.email }}</p>
{% endfor %}
</body>
</html>
2.启动Web服务
=============================
# app.py
async def init(loop):
await orm.create_pool(loop=loop, host='127.0.0.1', port=3306, user='root', password='', db='sufadi')
app = web.Application(loop=loop, middlewares=[
logger_factory, response_factory
])
# 通过router的指定的方法可以把请求的链接和对应的处理函数关联在
init_jinja2(app, filters=dict(datetime=datetime_filter))
add_routes(app, 'handlers')
add_static(app)
# 运行web服务,服务器启动后,有用户在浏览器访?,就可以做出对应的响应
# 127.0.0.1 本机地址
srv = await loop.create_server(app.make_handler(), '127.0.0.1', 9000)
logging.info('server started at http://127.0.0.1:9000...')
return srv
# 固定写法
loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()
=============================
coreweb.py
def add_routes(app, module_name):
app.router.add_route(method, path, RequestHandler(app, fn))
=============================
回调数据
coreweb.py
class RequestHandler(object):
async def __call__(self, request):
=============================
app.py
async def response_factory(app, handler):
async def response(request):
logging.info('Response handler...request %s' % request)
r = await handler(request)
3.访问mysql
=============================
# app.py
async def init(loop):
await orm.create_pool(loop=loop, host='127.0.0.1', port=3306, user='root', password='', db='sufadi')
=============================
# handlers.py
@get('/')
async def index(request):
logging.info('handlers.py handlers index: %s' % request)
users = await User.findAll()
return {
"__template__": "home.html",
'users': users
}
=============================
orm.py
@classmethod
async def findAll(cls, where=None, args=None, **kw):
' find objects by where clause. '
sql = [cls.__select__]
if where:
三、运行效果
确保 mysql 运行且有数据,在浏览器输入
1.日志
INFO:root:found model: User (table: users)
INFO:root:Found mapping: id --> <StringField, varchar(50):None>
INFO:root:Found mapping: email --> <StringField, varchar(50):None>
INFO:root:Found mapping: passwd --> <StringField, varchar(50):None>
INFO:root:Found mapping: admin --> <BooleanField, boolean:None>
INFO:root:Found mapping: name --> <StringField, varchar(50):None>
INFO:root:Found mapping: image --> <StringField, varchar(500):None>
INFO:root:Found mapping: created_at --> <FloatField, real:None>
INFO:root:found model: Blog (table: blogs)
INFO:root:Found mapping: id --> <StringField, varchar(50):None>
INFO:root:Found mapping: user_id --> <StringField, varchar(50):None>
INFO:root:Found mapping: user_name --> <StringField, varchar(50):None>
INFO:root:Found mapping: user_image --> <StringField, varchar(500):None>
INFO:root:Found mapping: name --> <StringField, varchar(50):None>
INFO:root:Found mapping: summary --> <StringField, varchar(200):None>
INFO:root:Found mapping: content --> <TextField, text:None>
INFO:root:Found mapping: created_at --> <FloatField, real:None>
INFO:root:found model: Comment (table: comments)
INFO:root:Found mapping: id --> <StringField, varchar(50):None>
INFO:root:Found mapping: blog_id --> <StringField, varchar(50):None>
INFO:root:Found mapping: user_id --> <StringField, varchar(50):None>
INFO:root:Found mapping: user_name --> <StringField, varchar(50):None>
INFO:root:Found mapping: user_image --> <StringField, varchar(500):None>
INFO:root:Found mapping: content --> <TextField, text:None>
INFO:root:Found mapping: created_at --> <FloatField, real:None>
INFO:root:建立数据库连接池
INFO:root:init jinja2...
INFO:root:set jinja2 template path: D:\python3-webapp-Su\www\templates
INFO:root:add_routes mod = <module 'handlers' from 'D:\\python3-webapp-Su\\www\\handlers.py'>
INFO:root:add_routes method = GET, path = /
INFO:root:add_routes app = <Application 0x3558870>, fn = <function index at 0x0354E540>
INFO:root:add route GET / => index(request)
INFO:root:get_named_kw_args : name = request, param = request, kind = POSITIONAL_OR_KEYWORD
INFO:root:RequestHandler : _app = <Application 0x3558870>
INFO:root:RequestHandler : _func = <function index at 0x034B7348>
INFO:root:RequestHandler : _has_request_arg = True
INFO:root:RequestHandler : _has_var_kw_arg = None
INFO:root:RequestHandler : _has_named_kw_args = None
INFO:root:add static /static/ => D:\python3-webapp-Su\www\static
INFO:root:server started at http://127.0.0.1:9000...
INFO:root:Request: GET /
INFO:root:Response handler...request <Request GET / >
INFO:root:call with args: {'request': <Request GET / >}
INFO:root:handlers.py handlers index: <Request GET / >
INFO:root:SQL: select `id`, `email`, `passwd`, `admin`, `name`, `image`, `created_at` from `users`
INFO:root:rows returned: 2
INFO:root:Response handler...__template__ {'__template__': 'home.html', 'users': [{'id': 1, 'email': 'test@163', 'passwd': '1221', 'admin': None, 'name': 'su001', 'image': None, 'created_at': None}, {'id': 2, 'email': 'test@qq', 'passwd': '234234', 'admin': None, 'name': 'sufadi', 'image': None, 'created_at': None}]}
INFO:root:isinstance dict templating <Response OK not prepared>esp
INFO:aiohttp.access:127.0.0.1 - - [07/Jan/2018:11:18:03 +0000] "GET / HTTP/1.1" 200 382 "-" "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"