# 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的调用生成每日诗歌+每日格言+每日天气提醒,为微信聊天提供素材,为考研/考教/考公提供每日格言激励,为情侣间每日激励提供素材。每日天气提醒功能可生成定制化城市查询,提供更好的查询服务。

# 问题表述
**“昊说”**, 利用API帮你制作每日暖心话语。本项目基于 Flask 和 Bulma进行构建,其中Bulma为bootstrap改造后的更具有用户体验的皮肤[https://bulma.io/](https://bulma.io/),考虑到为了让用户有更好的网站访问体验,加入JavaScript技术,通过Ajax与flask能够构建api的特性,进行前后端的交互联动,保证网站能够实现局部刷新,解决因flask+jinja2之能进行页面跳转的问题。
## 解决方案总
前端页面架构与页面视图函数的逻辑已使用图表形式展示,具体的详情请结合项目本身进行查看。
### 前端页面架构

### 页面视图逻辑

## 解决方案细(三个功能主要技术思路)
## 每日诗词
前端页面 /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/)等提供的技术支持~
- 编程思维让我对本次项目有更可行的想法,在构思时也更有逻辑性。关于挑战就是要克服很多不会的东西,例如想要照顾到交互逻辑和用户体验方面就需要掌握更多的知识。