一、简介:

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

“微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用

二、安装

pip3 install flask

三、werkzeug简介

Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等

代码示例:

fromwerkzeug.wrappersimportRequest,Response@Request.applicationdefhello(request):returnResponse('HelloWorld!')if__name__=='__main__':fromwerkzeug.servingimportrun_simplerun_simple('localhost',4000,hello)

四、flask快速使用

fromflaskimportFlask#实例化产生一个Flask对象app=Flask(__name__)#开启调试模式后,修改代码也可自动重启app.debug=True#将'/'与视图函数index的对应关系添加到路由中@app.route('/')defindex():return'ok'if__name__=='__main__':app.run()案例:登录,显示用户信息

main.py

fromflaskimportFlask,render_template,request,redirect,session,url_forapp=Flask(__name__)app.debug=Trueapp.secret_key='sdfsdfsdfsdf'USERS={1:{'name':'张三','age':18,'gender':'男','text':"道路千万条"},2:{'name':'李四','age':28,'gender':'男','text':"安全第一条"},3:{'name':'王五','age':18,'gender':'女','text':"行车不规范"},}@app.route('/detail/<int:nid>',methods=['GET'])defdetail(nid):user=session.get('user_info')ifnotuser:returnredirect('/login')info=USERS.get(nid)returnrender_template('detail.html',info=info)@app.route('/index',methods=['GET'])defindex():user=session.get('user_info')ifnotuser:#returnredirect('/login')url=url_for('l1')returnredirect(url)returnrender_template('index.html',user_dict=USERS)@app.route('/login',methods=['GET','POST'],endpoint='l1')deflogin():ifrequest.method=="GET":returnrender_template('login.html')else:#request.query_stringuser=request.form.get('user')pwd=request.form.get('pwd')ifuser=='lqz'andpwd=='123':session['user_info']=userreturnredirect('http://www.baidu.com')returnrender_template('login.html',error='用户名或密码错误')if__name__=='__main__':app.run()

templates/detail.html

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><h2>详细信息{{info.name}}</h2><div>{{info.text}}</div></body></html>

templates/index.html

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><h2>用户列表</h2><table>{%fork,vinuser_dict.items()%}<tr><td>{{k}}</td><td>{{v.name}}</td><td>{{v['name']}}</td><td>{{v.get('name')}}</td><td><ahref="/detail/{{k}}">查看详细</a></td></tr>{%endfor%}</table></body></html>

templates/login.html

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><formmethod="post"><p>用户名:<inputtype="text"name="name"></p><p>密码:<inputtype="password"name="pwd"></p><inputtype="submit"value="提交"></form></body></html>