# python期末项目 **Repository Path**: sweetiepiggy/python_final_project ## Basic Information - **Project Name**: python期末项目 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-23 - **Last Updated**: 2021-01-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目概述 ## 项目名称:“昊说”利用API帮你制作每日暖心话语 ### 价值主张 通过对api的调用生成每日诗歌+每日格言+每日天气提醒,为微信聊天提供素材,为考研/考教/考公提供每日格言激励,为情侣间每日激励提供素材。每日天气提醒功能可生成定制化城市查询,提供更好的查询服务。 ![](https://gitee.com/sweetiepiggy/python_final_project/raw/master/media/3.jpg) # 问题表述 **“昊说”**, 利用API帮你制作每日暖心话语。本项目基于 Flask 和 Bulma进行构建,其中Bulma为bootstrap改造后的更具有用户体验的皮肤[https://bulma.io/](https://bulma.io/),考虑到为了让用户有更好的网站访问体验,加入JavaScript技术,通过Ajax与flask能够构建api的特性,进行前后端的交互联动,保证网站能够实现局部刷新,解决因flask+jinja2之能进行页面跳转的问题。 ## 解决方案总 前端页面架构与页面视图函数的逻辑已使用图表形式展示,具体的详情请结合项目本身进行查看。 ### 前端页面架构 ![](https://gitee.com/sweetiepiggy/python_final_project/raw/master/media/1.jpeg) ### 页面视图逻辑 ![](https://gitee.com/sweetiepiggy/python_final_project/raw/master/media/2.jpeg) ## 解决方案细(三个功能主要技术思路) ## 每日诗词 前端页面 /form-contact.html  > 调用[今日诗词](https://www.jinrishici.com/),提供陶冶情操的文字 技术架构:
通过python flask 视图函数特性,结合[今日诗词](https://www.jinrishici.com/)的api调用方法,使用js开发可进行局部刷新诗词的诗词展示页面 - 使用三段 jinrishici.load(function(result) 保证每张卡片的诗歌均为不一样的内容 - 通过JavaScript的onclick 编写函数刷新诗词内容 - 本功能包含对JavaScript代码的编写,为个人发展项,内含函数、数据处理、字符串处理等知识点,如需复现请具体查看[今日诗词](https://www.jinrishici.com/)api的使用规则与JavaScript相关文档 ```javascript ``` ## 每日格言 **功能核心:python+ ajax + json 实现flask局部刷新的最佳案例**
前端页面 /form-mrgy.html > 调用每日格言,激励同学们勇敢前行! 技术架构:
通过python flask 视图函数特性,开发flask架构下的api,以json的格式进行数据传输,使用js的AJAX特性调用falsk服务器端的api进行每日格言的数据获取,并展示在页面当中 - 获取格言信息(从『一个。one』获取信息 [http://wufazhuce.com/](http://wufazhuce.com/))并封装成get_dictum_info() - 编写falsk开发api视图函数,调用格言函数get_dictum_info(),并转化为json格式 - 通过JavaScript的onclick和ajax特性编写函数刷新诗词内容,以json格式进行数据的调用与处理,进行数据渲染 **每日格言调用与数据处理函数** ```python def get_dictum_info(): """ 获取格言信息(从『一个。one』获取信息 http://wufazhuce.com/) :return: str, 一句格言或者短语。 """ headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/67.0.3396.87 Safari/537.36', } # print('获取格言信息...') user_url = 'http://wufazhuce.com/' resp = requests.get(user_url, headers=headers) if resp.status_code == 200: soup_texts = BeautifulSoup(resp.text, 'lxml') # 『one -个』 中的每日一句 every_msg = soup_texts.find_all('div', class_='fp-one-cita')[0].find('a').text return every_msg + '\n' print('每日一句获取失败。') return None ``` **falsk开发api视图函数** ```python @app.route("/api_mrgy", methods=['GET', 'POST']) def api_mrgy(): data = get_dictum_info() return jsonify({"msg": data}) ``` **使用Ajax调用API:api_mrgy 进行页面刷新渲染** ```javascript ``` ## 每日天气提醒 **功能核心:python+ ajax + json + jinja2 实现flask页面多功能跳转或刷新的最佳案例**
前端页面 /form-mrgy.html > 调用每日格言,激励同学们勇敢前行! 技术架构:
本项目在一个页面实现两种功能的展示,一个为通过python flask 视图函数特性,开发flask架构下的api,以json的格式进行数据传输,使用js的AJAX特性调用falsk服务器端的api进行每日天气的数据获取,在前端直接进行数据处理并展示在页面当中,另一个则使用flask+requests+jinja2利用form表单中input结合request进行数据的post请求,进行页面的跳转后再进行Ajax函数的调用,并对数据做出更多的处理,包括使用if、else的jinja2前端页面语法对页面展示进行优化。 ### 共同函数 ```python def get_weather(city="广州"): """调用api获取天气数据""" key = "" payload = { 'cityname': city, 'dtype': 'json', 'format': 1, 'key':key } req = requests.get('http://v.juhe.cn/weather/index', params=payload) return req.json() # provide login manager with load_user callback def weather_str(data_weather): tianqi_dict = {"城市":data_weather['result']["today"]['city'], "今日温度":data_weather['result']["today"]['temperature'], "今日天气":data_weather['result']["today"]['weather'], "风向":data_weather['result']["today"]['wind'], "穿衣指数":data_weather['result']["today"]['dressing_index'], "穿衣建议":data_weather['result']["today"]['dressing_advice'], } print_msg = ( ' 📍 您好,现在是北京时间{hour}点{minute}分,您所在的城市为{city},今天的天气为{weather},\ 温度为{temperature},伴有{wind},天气{dressing_index},{dressing_advice}\n'.format(\ city=tianqi_dict["城市"],weather=tianqi_dict["今日天气"],temperature=tianqi_dict["今日温度"],\ wind=tianqi_dict["风向"],dressing_index=tianqi_dict["穿衣指数"],dressing_advice=tianqi_dict["穿衣建议"],\ hour=datetime.datetime.now().hour,minute=datetime.datetime.now().minute)) return print_msg ``` ## 每日天气默认提醒 - 获取天气数据(从『极速数据』获取信息[https://www.jisuapi.com/](https://www.jisuapi.com/))并封装成get_weather() - 编写falsk开发api视图函数,编写weather_str()进行字符串的处理调用函数get_weather(),并转化为json格式 - 利用if else在前端进行渲染,函数调用方法与上一个功能相同 ### api函数设置 ```python @app.route("/api_weather", methods=['GET', 'POST']) def api_weather(): data = get_weather() return data #jsonify({"msg": data}) ``` ## 每日天气定制化提醒 - 获取天气数据(从『极速数据』获取信息[https://www.jisuapi.com/](https://www.jisuapi.com/))并封装成get_weather() - 编写falsk开发api视图函数,编写weather_str()进行字符串的处理调用函数get_weather(),并转化为json格式,利用form收集表单数据,后台判断性别进行定制化推送,发生请求给/mrtq,进行页面的跳转与渲染。 - 利用if else在前端进行渲染,函数调用方法与上一个功能相同 ### 视图函数代码 ```python # 每日天气定制化 @app.route("/mrtq", methods=['GET', 'POST']) def mrtq(): p_name = request.form["name"] sex = request.form["sex"] city = request.form["city"] if sex == '男': # print('男') msg = weather_str(data_weather=get_weather(city = city)) return render_template('layouts/default.html', content=render_template( 'pages/'+'form-mrtq.html',msg=msg,name= p_name+"先生") ) elif sex == '女': msg = weather_str(data_weather=get_weather(city = city)) return render_template('layouts/default.html', content=render_template( 'pages/'+'form-mrtq.html',msg=msg,name= p_name+"女士") ) ``` ### 项目使用SQLite 文件型数据库进行用户数据的存储 #### 用户登录验证代码展示 ```python # check if both http method is POST and form is valid on submit if form.validate_on_submit(): # assign form data to variables username = request.form.get('username', '', type=str) password = request.form.get('password', '', type=str) # filter User out of database through username user = User.query.filter_by(user=username).first() if user: if bc.check_password_hash(user.password, password): login_user(user) return redirect(url_for('index')) else: msg = "Wrong password. Please try again." else: msg = "Unkkown user" # try to match the pages defined in -> themes/phantom/pages/ return render_template( 'layouts/default.html', title=page_title, content=render_template( 'pages/login.html', form=form, msg=msg) ) ``` # 云端项目部署的基本描述 > 使用pythonanywhere进行部署后部分国内api无法进行调用,只能利用云服务器进行部署 **url链接**
首页:[http://47.100.76.29/](http://47.100.76.29/)
每日格言:[http://47.100.76.29/form-mrgy.html](http://47.100.76.29/form-mrgy.html)
每日诗歌:[http://47.100.76.29/form-contact.html](http://47.100.76.29/form-contact.html)
每日天气:[http://47.100.76.29/form-mrtq.html](http://47.100.76.29/form-mrtq.html)
主要功能介绍:[http://47.100.76.29](http://47.100.76.29/)
云服务器部署方法
服务器系统:window2012数据中心版
部署python falsk 前置条件是安装在服务器上安装python
以下为本项目具体部署步骤
1.安装并激活virtualenv:
``` $ virtualenv --no-site-packages env $ source env/bin/activate ```
2.下载所有第三方库
``` $ pip install -r requirements.txt ```
3.修改服务器端口开启服务
``` $ python app.py ``` ```python if __name__ == "__main__": db.create_all() port = int(os.environ.get("PORT", 80)) app.run(host='0.0.0.0', port=port, debug=True) #app.run(ssl_context='adhoc') ``` # 学习/实践心得总结及感谢    在本次项目开发中,我得到了智超老师、游鸽老师、黄杰琪同学的精心指导,不管是从开始定方向还是在编写技术文档的过程中,一向都耐心地给予我指导和意见,使我在项目开发与文档撰写方面都有了较大提高;同时也显示了老师高度的敬业精神和职责感,同学的友好互助与大佬担当。
尤其是黄杰琪同学对于代码的理解,不仅指导我进行falsk网站的三个功能的开发,跟是利用新学的技术JavaScript对该项目进行优化,保障搞项目的用户体验,为网站搭建开启了一条更优质道路。
在此,我对帮助我的同学与老师表示诚挚的感谢以及真心的祝福。此外感谢[今日诗词](https://www.jinrishici.com/)、[https://bulma.io/](https://bulma.io/)等提供的技术支持~ - 编程思维让我对本次项目有更可行的想法,在构思时也更有逻辑性。关于挑战就是要克服很多不会的东西,例如想要照顾到交互逻辑和用户体验方面就需要掌握更多的知识。