初识Flask
Posted 大邓带你玩python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识Flask相关的知识,希望对你有一定的参考价值。
大邓细数了我的文章,近60篇文章中只有一篇写 微信聊天机器人
使用了装饰器。大家不必担心学 不会装饰器肿么办、类学不会怎么办
这类问题。Python中 类
、 装饰器
都属于锦上添花之物,解决的是1和还是1+的问题。只有在长期学习使用python的过程中我们会很自然的将以前不懂的东西搞懂。那么,如何保持长期坚持学习使用python呢?
爱好、兴趣
目标(或利益)驱动
兴趣是最好的老师。如果没兴趣也没关系,有目标或利益驱动,你也是可以主动的积极地坚持学下去。
前几天看了一篇文章gitbook上的一篇干货 《技术人如何打造日赚1000+美元的赚钱利器》
。文章主要内容:
什么才是赚钱利器。
如何寻找利基市场。
如何通过搜索引擎挖掘利基市场、确认需求、产品设计到成功变现 。
站在前人的头顶上挣钱。。
相信大家看了之后,都能看到自己的“钱途”,干劲十足。大邓看了,第一想法就是我要学建网站,毕业前也搞一个玩玩。哈哈,所以要学flask啊
说了这么多废话,开始进入正题
Flask
Python Web开发的框架有很多,我一开始就选择Flask,选择原因 我觉得flask发音好听
,哈哈。
我没学过Django,看了很多争论,总结出来一句话Django大而全,Flask小而美。 我喜欢小而美,再加上发音简单易读,稀里糊涂学Flask。嘿嘿。
from flask import Flask
#实例化一个Flask对象
app = Flask(__name__)
"""
根目录/,路由器修饰的是index()函数返回的网页。
类似于文件系统中的文件夹。
"""
@app.route('/')
def index():
#字符串传输到网页
return '<h2>This is simple decorator used in Flask</h2>'
if __name__=='__main__':
#运行,调试模式打开
app.run(debug=True)
网页展示
一般我们写Flask需要创建一个项目,项目文件结构如下
static存放静态文件,比如css和js,templates存放html模板文件。
路由
route() 装饰器把一个函数绑定到对应的 URL 上。
这里是一些基本的例子:
"""
网页中对应的网址为'http://127.0.0.1:5000/'对应的是该路由装饰器修饰的函数
在这里是index()函数返回的网页
网页中内容为"Index Page"
"""
@app.route('/')
def index():
return 'Index Page'
"""
'http://127.0.0.1:5000/hello/'解释同上
网页中内容为"Hello World"
"""
@app.route('/hello/')
def hello():
return 'Hello World'
变量规则
比如
http://127.0.0.1:5000/user/张三
http://127.0.0.1:5000/user/李四
http://127.0.0.1:5000/pages/1
http://127.0.0.1:5000/pages/2
能不能通过变量的方式给 URL 传递参数,这种参数叫做<变量名>
规则可以用 <转换器:变量名> 指定一个可选的转换器。这里有一些不错的例子:
"""
比如我在网址栏目中输入'http://127.0.0.1:5000/user/张三/'
网页中会出现'Welcome 张三'
"""
@app.route('/user/<username>/')
def welcome_user(username):
return 'Welcome %s' % username
"""
比如我在网址栏目中输入'http://127.0.0.1:5000/pages/2/'
网页中会出现'这是第2页面'
"""
@app.route('/pages/<int:page>/')
def page_html(page):
return '这是第%d页面' % page
转换器有下面几种:
转换器 | 含义 |
---|---|
int | 接受整数 |
float | 接受浮点数 |
path | 和默认的相似,但也接受斜线 |
以这两个规则为例:
"""打开浏览器,输入
'http://127.0.0.1:5000/about'
'http://127.0.0.1:5000/about/'发现都指向同一个网页,也没有报错
"""
@app.route('/about/')
def about():
return 'The about page'
"""
网址栏输入'http://127.0.0.1:5000/about',返回Not found page
"""
@app.route('/about')
def about():
return 'The about page'
虽然它们看起来着实相似,但它们结尾斜线的使用在 URL 定义 中不同。
第一种情况中,about尾端有一个斜线。类似于文件系统中的文件夹。访问一个结尾不带斜线的 URL 会被 Flask 重定向到带斜线的规范 URL 去。
然而,第二种情况的 URL 结尾不带斜线,类似 UNIX-like 系统下的文件的路径名。访问结尾带斜线的 URL 会产生一个 404 “Not Found” 错误。
比较纠结的地方,不过遇到 404 “Not Found” 错误
,可能出错的地方在在这个有无下划线即可。
构造 URL
函数内能生成url吗? flask中的url_for() 用来给指定的函数构造 URL。它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数。这里有一些例子:
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'index page'
@app.route('/login')
def login():
return 'longin page'
@app.route('/user/<username>/')
def info(username):
return 'info page'
with app.test_request_context():
#url_for()第一个参数为函数名,返回该函数对应的url
print(url_for('login'))
#url_for()第一个参数为函数名,返回该函数对应的url
#后面还可增加关键词参数,关键词为对应的变量名。
print(url_for('info',username='zhangsan'))
if __name__=='__main__':
app.run(debug=True)
运行结果
/login
/user/zhangsan/
HTTP 方法
默认情况下,路由只回应 GET 请求,但是通过 路由装饰器中的methods 参数可以改变这个行为。由于这里展开会比较麻烦,直接用flask文档说明,如下:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
#一般的登录页面都需要输入用户名、密码,然后点击登录POST数据给网站
do_the_login()
else:
#打开一个网站,一般会get到登录界面。
show_the_login_form()
模板渲染
使用 Python 生成 HTML 十分繁琐低效,Flask 有配备 Jinja2 模板引擎。
在这里使用 render_template() 方法来作为返回。你需要做的一切就是将模板名和你想作为关键字的参数传入模板的变量。这里有一个展示如何渲染模板的简例:
from flask import render_template
@app.route('/')
def index():
return render_template('index.html', title='Welcome',name='张三')
Flask 会在 templates 文件夹里寻找模板。文件目录结构
/index.py
/templates
/index.html
这里有index.html模板实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{title}}</title>
</head>
<body>
<h1>{{title}},{{name}}</h1>
</body>
</html>
运行效果
flask博大精深,我只是写了简单易用的部分内容。更多flask内容请查看官方文档。
以上是关于初识Flask的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段