Your SlideShare is downloading. ×

一种多屏时代的通用 web 应用架构

2,678

Published on

2013-5-19 珠三角技术沙龙分享主题。

2013-5-19 珠三角技术沙龙分享主题。

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,678
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
20
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 一种多屏时代的通用 web 应用架构赖勇浩 @ 珠三角技术沙龙2013-5-19
  • 2. 自我介绍●game → webgame → web●珠三角技术沙龙组委、发起人之一●PyCon China 2011/2012 讲师– Python 于 webgame 的应用– 页游开发中的 Python 组件与模式●http://laiyonghao.com/
  • 3. 内容概述●Web 架构的变迁●实践经验分享●未来之路
  • 4. Web 架构的变迁( 1 )browser servertext/html
  • 5. 多屏时代有点不同。
  • 6. Web 架构的变迁( 2 )browserserverwap browserapp
  • 7. Web 架构的变迁( 2 )●问题:– 返回什么?
  • 8. Web 架构的变迁( 2 )●def request_wants_json():●best = request.accept_mimetypes ●.best_match([application/json, text/html])●return best == application/json and ●request.accept_mimetypes[best] > ●request.accept_mimetypes[text/html]
  • 9. Web 架构的变迁( 2 )●@app.route(/)●def show_items():●items = get_items_from_database()●if request_wants_json():●return jsonify(items=[x.to_json() for x in items])●return render_template(show_items.html,items=items)
  • 10. 插播: Accept
  • 11. 插播: mimerender●mimerender = mimerender.FlaskMimeRender()●render_xml = lambda message: <message>%s</message>%message●render_json = lambda **args: json.dumps(args)●render_html = lambda message: <html><body>%s</body></html>%message●render_txt = lambda message: message
  • 12. 插播: mimerender●@app.route(/)●@app.route(/<name>)●@mimerender(●default = html,●html = render_html,●xml = render_xml,●json = render_json,●txt = render_txt●)●def greet(name=world):●return {message:Hello, + name + !}●if __name__ =="__main__":●app.run(port=8080)
  • 13. 插播: mimerender●How to get it– mimerender is in PyPI, so its as easy as doing:– $ pip install mimerender
  • 14. Web 架构的变迁( 2 )browserservertext/htmlwap browserapptext/vnd.wap.wmlapplication/json
  • 15. Web 架构的变迁( 3 )●如果可以通过短信( SMS ……)使用业务
  • 16. Web 架构的变迁( 3 )browseradaptertext/htmlwap browserapptext/vnd.wap.wmlapplication/jsonadapteradapterserveradapterSMSapplication/json
  • 17. Web 架构的变迁( 3 )browseradaptertext/htmlwap browserapptext/vnd.wap.wmlapplication/jsonadapteradapterserveradapterSMSapplication/json?
  • 18. Web 架构的变迁( 3 )●业务与展现分享– server 专注业务实现,只需要提供 http api ,无须理会数据展现形式;– adapter 的业务简单,只需要维护会话,并对请求 / 响应进行转换;●易于分工– 内部可以分小组– 甚至外包(解决了我团队不熟悉短信中心协议的问题)●易于扩展– 支持更多设备(如自助终端、语音电话)
  • 19. Web 架构的变迁( 3 )●安全:对数据进行签名– client-id 、 client-key– sha1– 让 Date header 必填来确保每次请救不同
  • 20. 实践经验分享●Flask-RESTful– https://github.com/twilio/flask-restful
  • 21. Flask-RESTful: Argument Parsing●parser = reqparse.RequestParser()●parser.add_argument(rate, type=int, help=Rate tocharge for this resource)●args = parser.parse_args()●支持必填项、多值项、重命名●可从 post body 、 querystring 、 headers 、 cookies 、 file uploads 中读取
  • 22. Flask-RESTful: Output Fields●resource_fields = {●name: fields.String,●address: fields.String,●date_updated: fields.DateTime,●}●class Todo(Resource):●@marshal_with(resource_fields)●def get(self, **kwargs):●return db_get_todo() # Some function that queriesthe db
  • 23. Flask-RESTful: Output Fields●Renaming Attributes●Default Values●Custom Fields & Multiple Values●Url Field●Complex Structures●List Field●Nested Field
  • 24. Flask-RESTful: Resource MethodDecorators●def authenticate(func):●@wraps(func)●def wrapper(*args, **kwargs):●...●class Resource(restful.Resource):●method_decorators = [authenticate] # applies to allinherited resources
  • 25. 测试●一般情况下使用 curl 足矣– $ curl http://localhost:5000/todos/todo3– {"task": "profit!"}
  • 26. chtest●$ chtest --help●usage: chtest [-h] [--config-file CONFIG_FILE] --pathPATH [--method METHOD]●[--arg ARG] [--header HEADER] [--ensure-statusENSURE_STATUS]●[--ensure-header ENSURE_HEADER]●[--ensure-content ENSURE_CONTENT] [--print-header PRINT_HEADER]●[--print-json-path PRINT_JSON_PATH]
  • 27. requests●chtest is requests powered●Requests: HTTP for Humans– >>> r = requests.get(https://api.github.com/user,auth=(user, pass))– >>> r.status_code– 200– >>> r.headers[content-type]– application/json; charset=utf8– >>> r.text– u{"type":"User"...– >>> r.json()
  • 28. 未来之路●http-based VS tcp-based●Behavior-Driven Development
  • 29. Web 架构的变迁( 3 )browseradaptertext/htmlwap browserapptext/vnd.wap.wmlapplication/jsonadapteradapterserveradapterSMSRPC ??
  • 30. RPC 优劣●优势– 减少连接数– 更小的数据包– 乱序返回– 握手后的数据不需要签名( SSL/TLS )●劣势– 不能利用 HTTP 的基础设施– 需要学习好多新东西
  • 31. lettuce.it●Feature: Manipulate strings●In order to have some fun●As a programming beginner●I want to manipulate strings●Scenario: Uppercased strings●Given I have the string "lettuce leaves"●When I put it in upper case●Then I see the string is "LETTUCE LEAVES"
  • 32. lettuce.it●>>> @step(I have the string "(.*)")●... def have_the_string(step, string):●... world.string = string●>>> @step(I put it in upper case)●... def put_it_in_upper(step):●... world.string = world.string.upper()●>>> @step(I see the string is "(.*)")●... def see_the_string_is(step, expected):●... assert world.string == expected, ●... "Got %s" % world.string
  • 33. lettuce.it●from lettuce import step●from nose.tools import assert_equals●@step(some step with "(.*)"):●def some_step(step, from):●assert_equals(from, expectation)
  • 34. End.Thanks.@laiyonghao
  • 35. 额外赠送: flask-pypi-proxy您值得拥有。

×