Flask项目创建
打开Pycharm专业版,点击坐上角File,再点击New Project新建项目。左边栏选择flask,编译器选择python解释器或者其他虚拟环境。
完成之后会自动生成这样一个模板:
app.py中是最简单的一个示例。可以看到左侧还有一个static文件夹和template文件夹,template文件夹我目前所知是用来存放前端的html文件。
下面进行运行这个最简单的示例:
在终端terminal中输入flask run命令运行:
点击蓝色链接即可进入我们的页面
因为我们的函数return的是hello world因此界面显示hello world,但是直接将hello world改为中文会显示不出中文,我们需要进行一些配置:
我们新建一个config.py文件输入以下这行代码:
JSON_AS_ASCII = False
然后在app.py文件中加入这行代码便可以用上config.py的设置:
import config
app.config.from_object(config)
事实上我们不止可以返回一个字符串,我们返回一个字典,页面上也会显示一个字典:
@app.route('/')
def hello_world():
return {"username":"xiaoming"}
打开Debug mode
这里有个细节,我们看到终端中有个 Debug mode:off,这说明我们的调试模式是关闭的,这导致我们每次对代码进行更改都必须重新结束运行代码再重新运行才能生效,这样就会很麻烦。所以最好打开调试模式:
我们在终端输入:set FLASK_ENV=development 命令,再运行我们的代码试试:
可以看到调试模式已打开!这时你如果在代码第七行将hello world改为其他字符并保存代码后,直接在你的页面刷新就能出结果!
或者我们可以以另外一种方式打开Debug mode:
点击右上角Edit
再勾选FLASK_DEBUG
再在app.run()中间假如debug=True参数
app.run(debug=True)
然后再右键选择run也可以打开!
url与视图函数映射
我们回到代码,hello_world函数上面的装饰器@app.route('/')中的/代表根目录的意思(类比Linux)而这个引号里面的东西就是我们的url,也就是说你直接将url设置为根目录就会得到http://127.0.0.1:5000,(127.0.0.1是我们自己的地址,5000是默认端口号)。
如果我们对其进行更改,在其后面加上hello:
@app.route('/hello')
我们再直接进行flask run运行会发现说没有找到这个url
这是因为我们将url改了,而我们访问的url却没变。我们在地址栏加上/hello查看结果:
发现显示正常,说明app.route装饰器里的字符确实控制着url!
上述我们所作的会发现只有你自己的电脑可以使用服务,而网络中的其他电脑却不行。缺省设置就是这样的,因为在调试模式下该应用的用户可以执行你电脑中 的任意 Python 代码。如果你关闭了调试器或信任你网络中的用户,那么可以让服务器被公开访问。 只要在命令行上简单的加上 --host=0.0.0.0
即可:
其他电脑只需要访问第二个蓝色链接即可访问!
上述我们所作的好像和写前端差不多啊!不就是在页面上显示不同的东西吗?下面我们写个简单的交互:
我们加入下述代码:
books = [
{"id":1, "name":"水浒传"},
{"id":2, "name":"三国演义"},
{"id":3, "name":"西游记"},
{"id":4, "name":"红楼梦"}
]
@app.route('/books/<string:book_id>')
def book_detail(book_id):
for book in books:
if(book_id == str(book['id'])):
return book
return f"id为{book_id}的图书没有找到!"
我们所作的是在url中加入了变量:book_id,并且通过string:book_id的方式来指定这个变量必须为string类型,而下面的函数的功能是在我们定义的books列表字典中找到键key为我们url中的book_id的元素。
比如我们运行代码后在地址栏的地址后加入/books/1,便会显示列表字典中的第一个字典
加入/books/2后:
因此我们可以在url里加入变量进行操作!
下面放下完整代码:
from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config)
books = [
{"id":1, "name":"水浒传"},
{"id":2, "name":"三国演义"},
{"id":3, "name":"西游记"},
{"id":4, "name":"红楼梦"}
]
@app.route('/books/<string:book_id>')
def book_detail(book_id):
for book in books:
if(book_id == str(book['id'])):
return book
return f"id为{book_id}的图书没有找到!"
@app.route('/books/list')
def book_list():
return books
@app.route('/')
def hello_world():
return {"username":"xiaoming"}
if __name__ == '__main__':
app.run(host='0.0.0.0')
视图函数转url
主要介绍我们的url_for函数:使用给定值生成给定端点的 URL。
在上面的代码中我们有一个book_list函数在页面上显示我们所有的书籍,book_detail为每一本书籍分配了一个url并显示数据。那如果我们想在book_list函数中将我们的books字典为每本书加入一个url键值对,我们可以这么做:
@app.route('/books/list')
def book_list():
for book in books:
book['url'] = url_for("book_detail", book_id=book['id'])
return books
这样做的好处是不用自己给book['url']手打赋值,并且在我们的url变化时我们只需要变book_detail函数上面的装饰器即可,而不需要将其他用到book_detail的url都进行变化,节省了我们的时间!
下面我们进入/books/list链接h中查看结果:
完全正确!
指定HTTP方法
在@app.route()中可以传入一个关键字参数methods来指定本方法支持的HTTP方法,默认情况下,只能用GET请求。例如我们在上面代码中的book_detail的装饰器上进行修改:
@app.route('/books/<string:book_id>', methods=['GET'])
def book_detail(book_id):
for book in books:
if(book_id == str(book['id'])):
return book
return f"id为{book_id}的图书没有找到!"
我们将methods参数赋值为['GET'],进入books/1界面,右键点击检查,点网络,再刷新下:
可以看到请求方法为GET。一般像输入用户名密码的时候才为POST.。
参考资料: