5 - 提高用户体验
本章将介绍以下主题:
cookies
本文最新版本
代码: headlines.py
- import feedparser
- from flask import Flask
- from flask import render_template
- from flask import request
- from flask import make_response
- import datetime
- import json
- import urllib
- app = Flask(__name__)
- RSS_FEEDS = {'bbc': 'http://feeds.bbci.co.uk/news/rss.xml',
- 'cnn': 'http://rss.cnn.com/rss/edition.rss',
- 'fox': 'http://feeds.foxnews.com/foxnews/latest',
- 'iol': 'http://www.iol.co.za/cmlink/1.640'}
- WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather?q={}&units=metric&APPID=cb932829eacb6a0e9ee4f38bfbf112ed"
- CURRENCY_URL = "https://openexchangerates.org//api/latest.json?app_id=b23c94daab584f4580e4e2bf75cbcf7e"
- DEFAULTS = {'publication': 'bbc',
- 'city': 'London,UK',
- 'currency_from': 'GBP',
- 'currency_to': 'USD'
- }
- def get_value_with_fallback(key):
- if request.args.get(key):
- return request.args.get(key)
- if request.cookies.get(key):
- return request.cookies.get(key)
- return DEFAULTS[key]
- @app.route("/")
- def home():
- # get customised headlines, based on user input or default
- publication = get_value_with_fallback("publication")
- articles = get_news(publication)
- # get customised weather based on user input or default
- city = get_value_with_fallback("city")
- weather = get_weather(city)
- # get customised currency based on user input or default
- currency_from = get_value_with_fallback("currency_from")
- currency_to = get_value_with_fallback("currency_to")
- rate, currencies = get_rate(currency_from, currency_to)
- # save cookies and return template
- response = make_response(render_template("home.html", articles=articles,
- weather=weather, currency_from=currency_from,
- currency_to=currency_to, rate=rate, currencies=sorted(currencies)))
- expires = datetime.datetime.now() + datetime.timedelta(days=365)
- response.set_cookie("publication", publication, expires=expires)
- response.set_cookie("city", city, expires=expires)
- response.set_cookie("currency_from", currency_from, expires=expires)
- response.set_cookie("currency_to", currency_to, expires=expires)
- return response
- def get_rate(frm, to):
- all_currency = urllib.request.urlopen(CURRENCY_URL).read().decode('utf-8')
- parsed = json.loads(all_currency).get('rates')
- frm_rate = parsed.get(frm.upper())
- to_rate = parsed.get(to.upper())
- return (to_rate / frm_rate, parsed.keys())
- def get_news(publication):
- feed = feedparser.parse(RSS_FEEDS[publication.lower()])
- return feed['entries']
- def get_weather(query):
- query = urllib.parse.quote(query)
- url = WEATHER_URL.format(query)
- data = urllib.request.urlopen(url).read().decode('utf-8')
- parsed = json.loads(data)
- weather = None
- if parsed.get('weather'):
- weather = {'description': parsed['weather'][0]['description'],
- 'temperature': parsed['main']['temp'],
- 'city': parsed['name'],
- 'country': parsed['sys']['country']
- }
- return weather
- if __name__ == "__main__":
- app.run(host='0.0.0.0',port=8000, debug=True)
home.html
- <html>
- <head>
- <title>Headlines</title>
- <style>
- html {
- font-family: "Helvetica";
- background: white;
- }
- body {
- background: lightgrey;
- max-width: 900px;
- margin: 0 auto;
- }
- #header {
- padding-top: 5;
- background: lightsteelblue;
- }
- #inner-header {
- padding-left: 10;
- }
- #main{
- padding-left: 10
- }
- input[type="text"], select {
- color: grey;
- border: 1px solid lightsteelblue;
- height: 30px;
- line-height:15px;
- margin: 2px 6px 16px 0px;
- }
- input[type="submit"] {
- padding: 5px 10px 5px 10px;
- color: black;
- background: lightsteelblue;
- border: none;
- box-shadow: 1px 1px 1px #4C6E91;
- }
- input[type="submit"]:hover{
- background: steelblue;
- }
- </style>
- </head>
- <body>
- <div id="header">
- <div id="inner-header">
- <h1>Headlines</h1>
- <p>Headlines. Currency. Weather.</p>
- </div>
- <hr />
- </div>
- <div id="main">
- <h2>Current weather</h2>
- <form>
- <input type="text" name="city" placeholder="weather search">
- <input type="submit" value="Submit">
- </form>
- <p>City: <b>{{weather.city}}, {{weather.country}}</b></p>
- <p>{{weather.description}} |{{weather.temperature}}</p>
- <h2>Currency</h2>
- <form>
- from:
- <select name="currency_from">
- {% for currency in currencies %}
- <option value="{{currency}}" {{'selected="selected"' if currency_from==currency}}>{{currency}}</option>
- {% endfor %}
- </select>
- to:
- <select name="currency_to">
- {% for currency in currencies %}
- <option value="{{currency}}" {{'selected="selected"' if currency_to==currency}}>{{currency}}</option>
- {% endfor %}
- </select>
- <input type="submit" value="Submit">
- </form>
- 1 {{currency_from}} = {{currency_to}} {{rate}}
- <h2>Headlines</h2>
- <form>
- <input type="text" name="publication" placeholder="search" />
- <input type="submit" value="Submit" />
- </form>
- {% for article in articles %}
- <b><a href="{{article.link}}">{{article.title}}</a></b><br />
- <i>{{article.published}}</i><br />
- <p>{{article.summary}}</p>
- <hr />
- {% endfor %}
- </div>
- </body>
- </html>
可爱的 python 测试开发库 https://github.com/china-testing/python-api-tesing 请在 github 上点赞, 谢谢!
python 中文库文档汇总
[雪峰磁针石博客]python3 标准库 - 中文版
[雪峰磁针石博客]python3 快速入门教程
接口自动化性能测试线上培训大纲
python 测试开发自动化测试数据分析人工智能自学每周一练
更多内容请关注 雪峰磁针石: 简书
技术支持 qq 群: 144081101(后期会录制视频存在该群群文件) 591302926 567351477 钉钉免费群: 21745728
道家技术 - 手相手诊看相中医等钉钉群 21734177 qq 群: 391441566 184175668 338228106 看手相, 面相, 舌相, 抽签, 体质识别. 服务费 50 元每人次起. 请联系钉钉或者微信 pythontesting
python_flask_autotest5.PNG
来源: http://www.jianshu.com/p/5a4eb6947e41