Python中flask的简介和基本操作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python中flask的简介和基本操作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含10182字,纯文字阅读大概需要15分钟。
内容图文
文章目录
flask简介
flask深入学习文档: http://docs.jinkan.org/docs/flask/api.html#flask.request
Python有很多Web框架,可谓是百家争鸣,我这里列出几个比较叼的几个框架
- Django 市场占有率最高,官方文档几近完美,但是适合比较大的项目,小项目会显得累赘。
- Tornado 可异步,性能高,提供更多的底层细节,还能进行Web Socket
- Web.py 小巧,精炼,扩展不是很多,而且问题是作者太牛掰,被上帝请去喝茶了。
- Flask 年轻,2010年出现、可扩展、小巧、内置开发服务器和调试器、使用jinja2模板、完全兼容WSGI 1.0
Flask最最简单的一个页面
from flask import Flask # 导入包
app = Flask(__name__) # 创建一个Web应用
@app.route('/') # 定义路由(Views),可以理解为定义页面的URL
def index():
return "Hello World" # 渲染页面
if __name__ == "__main__":
app.run(host='127.0.0.1',port=8080) # 运行,指定监听地址为 127.0.0.1:8080
开启Debug调试
修改了代码,我们需要将开启的Web程序关闭再开启,这样会影响开发效率,也很烦。
Flask内部有一个功能,专门针对这样的事情发生。
if __name__ == "__main__":
app.run(host='127.0.0.1',port=8080,debug=True)
debug参数,这个参数默认是False
开启这个功能后,我们每次修改完代码,Web应用对自动进行调整。
现在修改代码并且保存,应用就会自动更新你的代码。
flask代码的基本解释
from flask import Flask # 导入包
app = Flask(__name__) # 创建一个Web应用
@app.route('/') # 定义路由(Views),可以理解为定义页面的URL
def index():
return "Hello World" # 渲染页面
if __name__ == "__main__":
app.run(host='127.0.0.1', port=8080) # 运行,指定监听地址为 127.0.0.1:8080
第3行:Flask需要一个参数,这个参数通常是主模块或是包的名字。所以通常会传入 —“name”
第5行:可以通过使用app.config类来修改配置,开启调试模式。当然,这里所采用的方法只能适用于设置很少的时候,以后会介绍另外几种修改配置的方法。
第7行: 还记得我之前提到了MVC吗?这里就是其中V,就是路由。这里的代码的目的就是为我们来指定一个路由,也就是页面的地址。
第8 – 9行: 使用app.route()装饰器会将URL和执行的视图函数(函数 index )的关系保存在app.url_map属性上。当你访问指定的URL时,就会调用这个函数。当遇到第一个return时,就会结束。其中的return就是你的response
第12行: 执行app.run来启动服务器。默认的Flask会监听的地址是127.0.0.1:5000。我们指定host和port参数,就修改了监听地址。 服务启动后,会先判断参数host以及port是否为None,如果为None,就会将host和port修改为默认值。然后会判断debug。然后就会调用werkzeug.serving.run_simple来启动Web服务,默认会使用单进程的werkzeug.serving_BaseWSGIServer来处理客户端的请求。
还要注意的就是,这里的app.run的启动方法,只适合在码代码的时候调试。
flask详细解析
flask启动参数
debug 是否开启调试模式,默认为False;开启后会有出错调试信息,文件会自动加载。
threaded 是否开启多线程,默认为Flase。
host 指定主机,默认为’127.0.0.1’,设置为’0.0.0.0’后可以通过IP进制访问
port 指定端口,默认为5000。
启动示例:app.run(debug=True, threaded=True, host=‘0.0.0.0’, port=5555)
flask路由
链接:https://www.jianshu.com/p/0013ec42176f
请求方式限定
使用 methods 参数指定可接受的请求方式,可以是多种
@app.route('/',methods=['GET'])
def hello():
return '<h1>hello world</h1>'
@app.route('/',methods=['GET', 'POST'])
def hello():
return '<h1>hello world</h1>'
路由查找方式
注意:多URL的路由匹配
允许在一个视图处理函数中设置多个url路由规则
@app.route('/')
@app.route('/index')
def index():
reutrn '回深圳'
注意:同一路由指向两个不同的函数,在匹配过程中,至上而下依次匹配
@app.route('/')
def hello():
return '<h1>hello world</h1>'
@app.route('/')
def hello_2017():
return '<h1>hello 2017</h1>'
所以上面路由 / 输出的结果为 hello 函数的结果
给路由传参示例
有时我们需要将同一类URL映射到同一个视图函数处理,比如:使用同一个视图函数 来显示不同用户的个人信息。
路由传递的参数默认当做string处理,这里指定int,尖括号中的内容是动态的,也可不指定类型
@app.route('/user/<int:id>')
def hello_itheima(id):
return 'hello itcast %d' %id
重定向redirect示例
from flask import redirect
@app.route('/')
def hello_itheima():
return redirect('http://www.itcast.cn')
@app.route('/show1/<name>')
def show(name):
return "<h1>姓名为:%s</h1>" % name
@app.route('/show2/<name>/<age>')
def show1(name,age):
return "<h1>姓名为:%s,年龄是:%s </h1>" % (name,age)
@app.route('/show3/<name>/<int:age>')
def show2(name,age):
return "<h1>指定类型->姓名为:%s,年龄是:%d </h1>" % (name,age)
if __name__ == "__main__":
app.run(debug = True)
返回JSON数据
from flask import Flask,json
@app.route('/json')
def do_json():
hello = {"name":"stranger", "say":"hello"}
return json.dumps(hello)
@app.route('/json2')
def demo4():
json_dict = {
"user_id": 10,
"user_name": "深圳"
}
return jsonify(json_dict)
# 不推荐使用 json.dumps 转成 JSON 字符串直接返回,因为返回的数据要符合 HTTP 协#议规范,如果是 JSON 需要指定 content-type:application/json
在 Python 中返回状态码有两种方式实现:
在 Python 中返回状态码有两种方式实现:
- 直接return
- 可以自定义返回状态码,可以实现不符合http协议的状态码,例如:error=666,errmsg=‘查询数据库异常’,其作用是为了实现前后端数据交互的方便
- abort方法
- 只会抛出符合http协议的异常状态码,用于手动抛出异常
@app.route(’/’)
def hello_itheima():
return ‘hello itcast’,666
正则路由示例
- 只会抛出符合http协议的异常状态码,用于手动抛出异常
重定向到视图函数
-
可以直接填写自己 url 路径
-
使用url_for实现视图方法之间的内部跳转 url_for(“视图方法名”)
from flask import redirect,url_for @app.route('/user/<user_id>') def user_info(user_id): return 'hello %d' % user_id @app.route('/response') def user_response(user_id): return 'hello!' @app.route("/index") def index(): # 1. 跳转到站内地址,例如其他页面 return redirect("/response") # 2.1 跳转到站内视图函数对应的页面中[没有附带地址参数] return redirect(url_for("index")) # 2.2 跳转到站内视图函数对应的页面中[有附带地址参数,通过命名参数传递路由参数] return redirect(url_for('user_info', user_id=100))
HTTP 异常主动抛出
- abort 方法
-
- 抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。只能抛出 HTTP 协议的错误状态码
- 参数:
-
- code – HTTP的错误状态码
# abort(404)abort(500)
from flask import Flask, abort, Response
app = Flask(__name__)
@app.route("/login", methods=["GET"])
def login():
name = ""
pwd = ""
if name != "maple" or pwd != "123":
# abort函数可以立即终止视图函数的执行
# 并返回给前端特定的信息
# 1 传递状态码信息, 必须是标准的http状态码
abort(404)
# # 2. 传递响应体信息
# resp = Response("login failed")
# abort(resp) # 返回Response响应对象
return "login success"
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
捕获错误
- errorhandler 装饰器
-
- 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法
- 参数:
-
- code_or_exception – HTTP的错误状态码或指定异常
- 例如统一处理状态码为500的错误给用户友好的提示:
@app.errorhandler(500)
def internal_server_error(e):
return '服务器搬家了'
- 捕获指定异常
@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
return '除数不能为0'
模板渲染
和django类似
链接: https://segmentfault.com/a/1190000012817254
jinji2: https://www.cnblogs.com/franknihao/p/7149499.html
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def test():
context = {
'title_name':"test_render",
'name':"sp4rk",
'test_variable':"It works"
}
return render_template('a.html', context=content)
if __name__ == '__main__':
flask视图函数
flask请求request
from flask import request
@blue.route('/getrequest/', methods=['GET', 'POST'])
def get_request():
if request.method == 'GET':
args = request.args
else:
form = request.form
return '获取request'
methods
默认的请求方式只有GET,其他请求都需要通过参数methods进行指定。
methods=['GET', 'POST']
args:获取GET请求参数
flask中,要获取get请求的参数,不是通过request.GET.get(),而是通过request.args.get()获取。
request.args.get('参数名')
form:获取POST请求参数
flask中,要获取get请求的参数,不是通过request.POST.get(),而是通过request.form.get()获取。
request.form.get('参数名')
files 获取上传文件
base_url 获取请求路径
host 获取ip和端口
flask的cookie和session
from flask imoprt Flask,make_response(或response)
@app.route('/cookie')
def set_cookie():
resp = make_response('this is to set cookie')
#resp = response('this is to set cookie')
resp.set_cookie('username', 'itcast')
return resp
设置过期时间,单位为秒
-
max_age:以秒为单位,距离现在多少秒后cookie会过期
-
expires:datetime类型,这个时间需要设置为格林尼治时间,也就是要距离北京少8个小时
-
如果max_age和expires都设置了,那么这时候以max-age为标准
-
如果没有指定过期时间,则默认为浏览器关闭后过期
设置cookie
@app.route('/cookie')
def set_cookie():
response = make_response('hello world')
response.set_cookie('username', '深圳', max_age=3600)
return response
获取cookie
from flask import Flask,request
#获取cookie
@app.route('/request')
def resp_cookie():
resp = request.cookies.get('username')
return resp
删除cookie
通过Response.delete_cookie方法,指定cookie的key,就可以删除cookie了
@app.route('/del/')
def delete_cookie():
resp = Response("删除cookie")
#设删除cookie,
resp.delete_cookie('username')# 删除指定key值的
return resp
Session
- 对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
- 在服务器端进行状态保持的方案就是
Session
- Session依赖于Cookie
- 设置session:通过flask.session就可操作session了,操作session就跟操作字典是一样的。session[‘username’] = ‘derek’
- 获取session:也是类似字典,session.get(‘key’)
- 删除session:session.pop(key),删除指定的值;session.clear(),删除session中所有的值
- 设置session有效期:如果没有设置session的有效期。那么默认就是浏览器关闭后过期。如果设置session.parmanent=True,那么就会默认31天后过期。如果不想在31天后过期,那么可以设置app.config[‘PERMANENT_SESSION_LIFETIME’]= timedelta(hour=2),可以指定多久后过期(比如:2小时)。
session数据的获取
session:请求上下文对象,用于处理http请求中的一些数据内容
@app.route('/index1')
def index1():
session['username'] = 'itcast'
return redirect(url_for('index'))
@app.route('/')
def index():
return session.get('username')
flask蓝本
链接: https://blog.csdn.net/Enjolras_fuu/article/details/79933756
flask配置
链接: https://blog.csdn.net/weixin_44141899/article/details/86498479
https://www.cnblogs.com/open-yang/p/11172829.html
https://www.cnblogs.com/aomi/archive/2017/07/26/7238468.html
flask静态文件加载
https://blog.csdn.net/hellosweet1/article/details/79729861
内容总结
以上是互联网集市为您收集整理的Python中flask的简介和基本操作全部内容,希望文章能够帮你解决Python中flask的简介和基本操作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。