系列文章
Python 学习 01 —— Python基础
Python 库学习 —— urllib 学习
Python 库学习 —— BeautifulSoup4学习
Python 库学习 —— Re 正则表达式
Python 库学习 —— Excel存储(xlwt、xlrd)
Python 学习 02 —— Python爬虫
Python 库学习 —— Flask 基础学习
Python 学习03 —— 爬虫网站项目
一、Flask简单介绍
Python做Web开发常用框架之一,通常来说,大型项目用Django,小型项目用Flask。著名的网飞(Netflix)也是使用Flask开发。
Flask是轻量框架,本身带有Werkzeug(用于路由解析)
和Jinja2(用于模板渲染)
,同时Flask有非常丰富的第三方库,需要什么就安装什么,所以自身是比较小巧的。
二、项目创建(进入调试模式/热部署)
- 新建项目时选择Flask(初次创建时会下载一些包)
![创建项目](https://i-blog.csdnimg.cn/blog_migrate/daf1cb8b13c83faa6f0bfdb7d9c27cad.png)
-
创建好的项目如下:
其中,
static
是用来放CSS、JavaScript等静态资源,templates
是用来放HTML等渲染模板。右侧代码
app = Flask(__name__)
把Flask框架导入进来,赋给app,所以后面就可以使用变量app来操作Flask框架。代码
@app.route('/')
是进行路由解析,即后续我们访问http://127.0.0.1:5000/
会默认解析到函数hello_world()。学过Java Web这些应该都比较清楚。
-
运行程序
右键运行或者右上角点运行按钮,会出现下面结果,点击下面的链接或者去浏览器输入链接,可以访问网站(路由解析到hello_world函数)
-
开启热部署/调试模式
对代码进行修改后,都需要重新运行才能看见修改的效果,而开启调试模式可以即时看到修改效果(。
- PyCharm 专业版:
- PyCharm 社区版(也可以按专业版方法)
出现下面样子,表示开启成功:
三、路由解析
前面说过,@app.route('/')
是对默认路径进行解析http://127.0.0.1:5000/
,如果对Java Web有了解就知道,我们可以携带参数、修改路径等等。
-
修改路径
# 访问 http://127.0.0.1:5000/index @app.route('/index') def index(): return '这是首页'
-
传递字符串参数
# 访问 http://127.0.0.1:5000/user/小白,name是str类型 @app.route('/user/<name>') def welcome(name): return '你好, %s' % name
-
传递整型参数
# 访问 http://127.0.0.1:5000/user/123,路由解析会自动判断我们传递参数的类型,来自动选择执行哪个函数 @app.route('/user/<int:id>') def welcome2(id): return '%d号会员,你好' % id
-
传递浮点数类型
# 访问 http://127.0.0.1:5000/user/1.11 @app.route('/user/<float:money>') def welcome3(money): return '您花费了%f' % money
四、渲染模板
写网站一般都会用到HTML,Python开发也不例外,我们会将HTML放在templates
文件夹下,使用Jinja2
进行渲染。
- 返回HTML
# 要导入render_template
from flask import Flask, render_template
app = Flask(__name__)
# 使用render_template来加载HTML
@app.route('/')
def hello_world():
return render_template('index.html')
if __name__ == '__main__':
app.run()
结果:
-
向HTML传递参数
传递的参数直接加在
render_template
后面,参数名称前面是HTML里访问名,后面是当前模块里的变量名。from flask import Flask, render_template import datetime # 导入时间模块 app = Flask(__name__) @app.route('/') def hello_world(): time = datetime.date.today() # 传递 普通变量(今天日期) nameList = ["小白", "小红", "小蓝"] # 传递 列表 gradeDic = {"语文成绩": 90, "数学成绩": 85, "英语成绩": 78} # 传递字典 # 传递参数:HTML里的变量名=当前变量名 return render_template('index.html', var=time, age=18, list=nameList, gradeDic=gradeDic) if __name__ == '__main__': app.run()
HTML中使用Jinjia2的语句进行访问:
- 访问普通变量:
{{ 传递的变量名 }}
- 迭代:以
{% for xx in xx %}
开始,以{% endfor %}
结束。 - 判断:以
{% if %}
开始,以{% endif %}
结束。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <!-- 普通变量 --> 今天的日期:{{ var }} <br/> <!-- if语句 --> {% if age < 18 %} <p>未成年</p> {% elif age == 18 %} <p>刚刚成年</p> {% else %} <p>已经成年了</p> {% endif %} <!-- 列表变量 for --> 名称列表:<br/> {% for name in list %} <li>{{ name }}</li> {% endfor %} <!-- 字典变量 for,items()的效果是使字典变为列表 [("语文",90),("数学",85),("英语",78)] --> <table border="1"> {% for key, value in gradeDic.items() %} <tr> <td>{{ key }}</td> <td>{{ value }}</td> </tr> {% endfor %} </table> </body> </html>
结果:
- 访问普通变量:
五、表单提交
Web开发中经常会用到表单,这里简单举例一下Flask框架提交表单怎么写。
- 项目结构
-
注册页面 register.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册页面</title> </head> <body> <!-- 提交表单给 http://127.0.0.1:5000/result,注意这里是以POST方式提交 --> <!-- url_for('result') 等价于 http://127.0.0.1:5000/result,result是映射到 app.py 的result函数 --> <!-- 通常我们使用url_for函数,而不是直接写url链接,这样更加灵活 --> <form action="{{ url_for('result')}}" method="post"> <p>账户:<input type="number" name="name"></p> <p>密码:<input type="password" name="password"></p> <p><input type="submit" value="提交"></p> </form> </body> </html>
-
结果显示页面 result.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>结果页面</title> </head> <body> <!-- 传递过来的参数 result 是一个字典 --> <table border="1"> {% for key, value in result.items() %} <tr> <th>{{ key }}</th> <td>{{ value }}</td> </tr> {% endfor %} </table> </body> </html>
-
Flask操作 app.py
# 导入需要的模块,request用于获取表单参数 from flask import Flask, render_template, request app = Flask(__name__) # 跳转到表单页面 @app.route('/form/toRegister') def register(): return render_template("form/register.html") # 跳转到结果页面,并传递表单参数。允许POST和GET方式。 @app.route('/toResult', methods=["POST", "GET"]) def result(): # 对POST方式提交过来的表单数据进行处理 # POST方式用 request.form 获取数据,GET方式用 request.args获取数据 if request.method == "POST": result = request.form # 获取到表单数据(这里是字典类型的,key对应于input的name,value就是输入值 return render_template("form/result.html", result=result) if __name__ == '__main__': app.run()
运行结果: