Head First Python 读书笔记(三)
2018-07-07 本文已影响0人
icessun
第五章 :构建一个WEB应用
利用Flask
web框架
安装Flask
- 使用
pip
命令
打开命令行提示窗口,输入如下命令(注意大小写,Windows下):py -3 -m pip install flask
下载Flask
使用这个命令去更新
第三方的模块:py -3 -m pip install --upgrade 模块名字
或者py -3 -m pip install -U 模块的名字
,这里--upgrade
:就是更新的意思。
测试是否安装成功
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello()->str:
return 'Hello world from Falsk!'
app.run()
编写一个测试文件hello_flask.py
,如上;打开命令行窗口,输入命令,启动该文件:py -3 hello_flask.py
然后打开浏览器,输入上面的地址,注意观察命令行窗口的状态提示信息: 成功执行
代码解析
# 从flask 模块中导入 Flask函数 或者 这样 import flask 然后使用 flask.Flask 去调用这个模块里面的函数
from flask import Flask
# 创建一个Flask类型对象,并赋值给 app;
#里面的参数 (_ _name_ _)是两个下划线,代表着当前活动模块的名字;
#创建一个Flask类型对象的时候,需要知道__name__的当前值,所以必须传递
app=Flask(__name__)
print(__name__) # __main__
# URL 地址 ,前面的@是一个修饰符前缀,
# route是修饰符:将一个URL路径与一个函数关联;
#当一个指向 " / " url 的请求到达服务器,Flask就会去执行关联的hello函数,然后等待函数执行完的结果,返回给服务器
@app.route('/')
def hello()->str:
return 'Hello world from Falsk!' # 向其调用者返回一个字符串
# 运行Flask的web服务器
app.run()
- 修饰符:根据需要为已知的函数代码增加一些额外的行为,而不是修改函数的代码,可以修饰函数,也可以修饰类;也可以自己创建函数修饰符
添加第二个页面
按照笔记二的做法,发布了模块vsearch
,然后修改了hello_flask.py
文件,如下:
# 向等待的Web浏览器返回任何结果之前,一定要通过str内置函数(BIF)将结果强制转换为一个字符串
from flask import Flask
from vsearch import search4letters
app = Flask(__name__)
# 第一个表单输入页面
@app.route('/')
def hello()->str:
return 'Hello world from Falsk!'
# 第二个结果输出页面
@app.route('/search')
def do_search()->str:
return str(search4letters('life ,the universe,and everything!', 'eivu,!'))
app.run()
运行结果
使用模板创建页面
利用模板引擎,可以应用面向对象的继承和重用
概念来生成文本数据。
利用模板,可以将python代码(web应用的逻辑)和HTML页面(web应用用户界面)分离
Flask
提供一个函数:render_template
,传入指定的模板名字和所需要的参数,调用该函数就会返回一个HTML
串;而且Flask
还要求你的模板文件存储在一个templates
的文件夹下面。这里使用Jinja2
模板引擎。
- 修改后的
hello_flask.py
文件
from flask import Flask, render_template, request
from vsearch import search4letters
app = Flask(__name__)
@app.route('/search', methods=['POST', 'GET'])
def do_search()->'html':
phrase = request.form['phrase']
letters = request.form['letters']
title = 'Here are your results:'
results = str(search4letters(phrase, letters))
return render_template('results.html', the_phrase=phrase, the_letters=letters, the_titles=title, the_results=results,)
@app.route('/')
@app.route('/entry')
def entry_page()->'html':
return render_template('entry.html', the_title='Welcome to icessun plants')
# 打开调试模式
app.run(debug=True)
模板文件和样式文件应该和python文件都在一个文件目录下面:
目录结构
-
http
方法-
get
:浏览器从web服务器请求一个资源 -
post
:浏览器通过http向服务器发送数据,与form标记
紧密相连
-
-
让你的URL支持get和post方法,只需要在route修饰符中加入对应的方法即可,最好是和你表单数据提交到服务器上面是一样的
@app.route('/search', methods=['POST','GET'])
- Flask 获取HTML的表单数据
通过其内置对象request
,访问表单所对应的name
属性:
def do_search()->str:
phrase = request.form['phrase']
letters = request.form['letters']
return str(search4letters(phrase, letters))
访问表单数据
- 重定向来避免不想要的错误
上面的代码,我是直接把起始页面/
和entry
页面合并在一起了(比较好,只有一次请求),也可以使用重定向302
去做,这样有缺点:多了一次请求:
from flask import redirect
@app.route('/')
def hello()->'302':
return redirect('/entry')
最后做成的WEB应用:
web应用首页 web应用结果页部署到云PythonAnywhere
- 根据环境去选择的执行代码
就是说,你在本地和在远程上面执行都使用一套代码,不需要两套。
if __name__=='__main__':
app.run(debug=True)
- 第一步:打包你要上传的源代码
- 第二步:登录
PythonAnywhere
网站注册 - 第三步:点击
File
页签,上传源代码 - 第四步:
源代码地址:HeadFirstPython