# Python期末项目 **Repository Path**: lvhonglu/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-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Python期末项目 ## 一、项目介绍 ### 1. 项目标题与简介 [W&H(Where&how)](http://lvhonglu.pythonanywhere.com/base)是一个智能搜索网站。能够通过智能 API 分析你所上传的景色图片并且识别出地标。网站自带导航功能,识别到地标后可以快速导航至目的地。便捷有效。 ### 2. 问题表述 - 用户画象:喜欢旅游的群体。 - 用户使用场景:在网络上看到的图片觉得这个地方很美很好看想去,却不知道这是哪里,这时就可以使用我们的产品进行搜索,并且使用我们的产品进行导航。 - 用户任务:在网络社交媒体上找到好看的地方的图片。 - 用户痛点:现在很多人都喜欢将自己去的好玩的地方上传,但是却没有说是什么地方在哪里,导致其他看到这个照片分享且也想去玩的人很难得到具体位置并前去。 - 产品益点:让大家方便找到图片中好看的景点具体位置并且可以导航到那。 ![价值主张画布](picture/python价值主张画布.jpg) ## 二、解决方案 ### 1. 项目规划与知识点 本项目实现了地标识别,导航,日志,登录,注册等功能,并配合HTML 、CSS 相关知识来完成。 | 步骤 | 步骤描述 | Python基础知识点 | | --- | --- | --- | | 1 | 调用百度、高德地图API | API的调用 | | 2 | 通过Flask架构网站 | Flask的使用和函数 | | 3 | 通过MySQL数据库进行对注册和登陆信息的录入和读取 | MySQL数据库的调用 | | 4 | 对调用出的API所返回的参数进行选择和呈现 | 列表和字典取值 | | 5 | 实现日志的读取和页面呈现 | 日志 | | 6 | 修改样式,优化网站 | HTML、CSS | | 7 | 进行云端部署 | Pythonanywhere | ### 2. 编程功能的基本描述 #### 2.1 [完整代码压缩包](https://gitee.com/lvhonglu/python-final-project/blob/master/python_qimo.zip) #### 2.2 本项目可能需要的学习成本 所有代码中涉及到的知识主要包括python和html两大部分,占比如下: | | PYTHON | HTML5 | | :----: | :----: | :----: | | 代码量 | 40% | 60% | | 实现项目的功能 | 75% | 15% | | 所占用的学习时间 | 70% | 30% | | 逻辑难度(理解难度) | 4星 | 1星 | | 操作难度 | 4星 | 2星 | #### 2.3项目主体功能 获取client_id与client_secret: ``` # 百度API的ID和秘钥 client_id ='3VlFtdWv8kdtfm5PeRnuoIo8' client_secret ='a8E5dZ2PlIHtOZwQpBnE5CSmxtpN9R0Y' ``` 通过API Key和Secret Key获取access_token: ``` # encoding:utf-8 import requests import pandas as pd import json # client_id 为官网获取的AK, client_secret 为官网获取的SK host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=WmoAqK4R5PiyTTBe37SYCLzA&client_secret=h7rcG9Gu5sT6rCLZjzVxImc1IL2wumGR' response = requests.get(host) if response: print(response.json()) pd.json_normalize(response.json()).T ``` ``` access_token = response.json()["access_token"] access_token # 返回结果:'24.7b219bffe4ed77092296692c9fe4f368.2592000.1614003688.282335-23581237' ``` 地标识别代码: ``` # encoding:utf-8 import requests import base64 ''' 地标识别 ''' request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/landmark" # 二进制方式打开图片文件 f = open('C:/Users/86133/Desktop/w.jpg', 'rb') img = base64.b64encode(f.read()) params = {"image":img} access_token = '24.7b219bffe4ed77092296692c9fe4f368.2592000.1614003688.282335-23581237' request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: print (response.json()) ``` 地图识别 ``` key = request.form['key'] start_address = request.form['start_address'] end_address = request.form['end_address'] title = '查询结果' df = bicycling.bicycling(key, start_address, end_address) results = df.loc[:, ['instruction', 'distance', 'duration' , 'action']] results.columns = ['指引', '路程', '时间' , '弯道'] total_bicycling = bicycling.total_bicycling(df) total_bicycling_time = bicycling.total_bicycling_time(df) route = results['指引'].tolist() bicycling.log_request(request, route) return render_template('results.html', the_title=title, the_start_address=start_address, the_end_address=end_address, the_results=results, the_html=results.to_html(index=False), the_total_bicycling=total_bicycling, the_total_bicycling_time=total_bicycling_time,) ``` ### 3. 云端项目部署的基本描述 #### 3.1 页面链接与页面功能介绍 - [欢迎页](http://lvhonglu.pythonanywhere.com/base):http://lvhonglu.pythonanywhere.com/base (点击搜索即可进入) - [登录页](http://lvhonglu.pythonanywhere.com/login):http://lvhonglu.pythonanywhere.com/login (可从此页面登录) - [注册页]:(http://lvhonglu.pythonanywhere.com/zhuce):http://lvhonglu.pythonanywhere.com/zhuce (没有账号的可以从这里注册) - [注册成功页]:(http://lvhonglu.pythonanywhere.com/zhuce2):http://lvhonglu.pythonanywhere.com/zhuce2 (可以直接返回登录页) - [选择搜索项目页]:(http://lvhonglu.pythonanywhere.com/xuanze):http://lvhonglu.pythonanywhere.com/xuanze (选择搜索项目) - [地标识别页]:(http://lvhonglu.pythonanywhere.com/intoplace?):http://lvhonglu.pythonanywhere.com/intoplace? (可以在此上传图片的url进行地标的识别) - [地表识别结果页]:(http://lvhonglu.pythonanywhere.com/place):http://lvhonglu.pythonanywhere.com/place (识别后可以点击返回【可能会出现500,是pythonanywhere的问题哦,建议下载完整代码至本地进行测试~】) - [高德导航页](http://lvhonglu.pythonanywhere.com/intoresult01?):http://lvhonglu.pythonanywhere.com/intoresult01? (可以在此页进行高德导航页) - [高德导航页结果页](http://lvhonglu.pythonanywhere.com/results):http://lvhonglu.pythonanywhere.com/results (高德导航后的结果【可能会出现500,是pythonanywhere的问题哦,建议下载完整代码至本地进行测试~】) - [日志页](http://lvhonglu.pythonanywhere.com/viewlog?):http://lvhonglu.pythonanywhere.com/viewlog? (有查询记录【可能会出现500,是pythonanywhere的问题哦,建议下载完整代码至本地进行测试~】) 共10个页面 有效功能页面数量共10个 #### 3.2 页面流程图 ![流程图](picture/流程图.jpg) #### 3.3 云端功能 可以上传新的文件以及直接修改文件,可以进行新的部署,在联网情况下可在每一台设备上使用部署好的网站。 #### 3.4 部署心得 先在Pythonanywhere官网上注册,拥有自己的账号后,将项目压缩文件包(zip格式)上传,通过控制台进行解压,再移动到创建好的mysite文件夹中,在控制台进行部署操作,使用自带数据库,修改Pythonanywhere给的数据库用户名和密码,更新云端部署,打开网站检测是否部署成功,最终完成云端部署。刚开始学习部署的时候,是跟着老师一步一步操作的,所以觉得很简单,后来回来之后尝试将自己的文件部署上传就开始一直报错。所以我又开始重新尝试先部署老师的网站,再熟悉一次部署过程,老师的成功之后再一次部署自己的也就更顺利了。 [部署学习链接](https://www.jianshu.com/p/5d120cfd386e) ## 三、学习/实践心得总结及感谢 这次项目完成的可以说是非常艰难,一直在试错试错试错,其中地标识别的试错试了一整天,还是显示不出来查询不了。最后问同学,请同学指导帮助后终于可以查询了,也就是现在的成果。在这次期末项目的完成中,我也明白了同学互相协助是多么重要,及时向老师反馈问题请教老师也很重要,在这里我要感谢许智超老师和游鸽老师一个学期以来的教导,不管是在代码还是api的学习上都给了我很大的帮助。同时也要感谢同学的帮助,每当我觉得做不下去的时候,他们就像希望的曙光,一步一步的教我把我带出困境。这次的期末项目完成的很困难,但是收获也很大。 最后,非常感谢: - 感谢百度API提供的免费服务: [地标识别文档](https://cloud.baidu.com/doc/IMAGERECOGNITION/s/jk3bcxbih) - 感谢高德地图API提供的免费服务: [高德地图API](https://lbs.amap.com/) - 感谢bootstrap官网提供模板: [bootstrap中文网](https://www.bootcss.com) [bootstrap优选网站实例](https://www.youzhan.org) - 感谢Pythonanywhere提供免费的云端部署服务以及简书部署学习链接: [pythonanywhere官网](https://www.pythonanywhere.com) [部署学习链接](https://www.jianshu.com/p/5d120cfd386e) - 感谢各类学习网站提供的HTML、CSS、Python3、log教程: [HTML 元素](https://www.runoob.com/html/html-elements.html) [HTML 颜色名](https://www.runoob.com/html/html-colornames.html) [HTML 属性](https://www.runoob.com/html/html-attributes.html) [HTML CSS](https://www.runoob.com/html/html-css.html) [HTML 区块](https://www.runoob.com/html/html-blocks.html) [CSS 语法](https://www.runoob.com/css/css-syntax.html) [HTML 插入链接](https://www.runoob.com/html/html-links.html) [HTML 表格](https://www.runoob.com/html/html-lists.html) [HTML 头部](https://www.runoob.com/html/html-head.html) [如何调用api接口](https://www.cnblogs.com/qaing123/p/7465828.html) [HTML action](https://www.runoob.com/tags/att-form-action.html) [log文件的读并写入.text文件](https://blog.csdn.net/yuchou123456789/article/details/7198657) [Python PEP8 编码规范中文版](https://www.cnblogs.com/zhigu/p/10349048.html) 外联链接共30个