Python实战之路-day4
人生本来就是一场即兴的演出,没有做不成的梦,只有不愿早醒的人。 Hello Python - day4!
- Flask框架的简介
- 官方的一些连接文档
1 http://flask.pocoo.org/ 官网 2 http://dormousehole.readthedocs.org/en/latest/ 中文官网 3 http://www.pythondoc.com/ 很全的文档 4 http://docs.jinkan.org/docs/flask/ 很全面
- 环境部署
1 安装Virtualenv——虚拟环境能够隔离不同python版本的干扰 2 pip install virtualenv # 直接pip安装 3 mkdir myproject # 创建项目环境 4 cd myproject 5 virtualenv venv 6 chmod +x ./venv/bin/activate 7 ./venv/bin/activate 或 8 source /venv/bin/activate # 每次运行项目时需要激活环境
- 源码安装
1 wget https://pypi.python.org/packages/source/F/Flask/Flask-0.10.tar.gz --no-check-certificate 2 tar zxvf Flask-0.10.tar.gz 3 cd Flask 4 virtualenv venv --distribute 5 chmod +x ./venv/bin/activate 6 ./venv/bin/activate 7 python setup.py develop
- pip直接安装
pip install Flask
- Flask简单的小实例剖析
- Flask应用的小实例
1 vim hello.py 2 3 from flask import Flask # 导入Flask模块 4 app = Flask(__name__) # 定义flask的实例。可理解为类实例化的对象,对象名可以任意,常用app。 5 @app.route('/') # 用@app. route() 装饰器定义访问 URL 6 def index(): # 执行任务的函数 7 return 'hello world!' 8 if __name__ == '__main__': # 执行本文件时,才能执行app.run(),外部import是不能执行的 9 app.run(host='0.0.0.0',port=5000,debug=True) # 启动服务,定义监听ip,端口,并开启调试 ,默认flask是监听 127.0.0.1的5000端口
- 运行服务和访问测试
1 运行服务 2 $ python hello.py 3 * Running on http://0.0.0.0:5000/ 4 访问测试 5 curl http://192.168.1.250:5000 6 hello world
- Flask的路由(URL)基本设置
- 简单的模型
1 简单明了的uri方便记忆,给用户良好的体验。route()装饰器用于把一个函数绑定到一个URL 2 3 @app.route('/') # 为index函数绑定访问url,访问地址:http://ip, 结果Index Page 4 @app.route('/index') # 同一个函数可以绑定多个URL 5 def index(): # URL绑定的函数 6 return 'Index Page' 7 8 @app.route('/hello') # 为hello函数绑定访问url,访问地址:http://ip/hello,结果为Hello World 9 def hello(): 10 return 'Hello World'
- 通过变量定义URL---url变量名必须和绑定函数的形参名一致
1 @app.route('/user/<string:username>') # uri定义了参数,访问http://ip/user/guanqing 2 def index(username): 3 return 'welcome %s' % username 4 5 @app.route('/post/<int:post_id>') # 访问http://ip/post/28 , init把输入的参数转换为整数型 6 def post(post_id): 7 return 'Post id is %d' % post_id
- URL反斜杠之间的区别
1 1 # URL不带 / ,访问http://ip/hello时返回200, 访问http://ip/hello/ 时返回404 2 2 @app.route('/hello') 3 3 def hello_world(): 4 4 return 'Hello world!' 5 5 6 6 # 带 / ,访问http://ip/hello时301跳转到http://ip/hello/ 访问http://ip/hello/时返回200 7 7 @app.route('/hello/') 8 8 def hello_world(): 9 9 return 'Hello world!'
- URL传参及request接受参数的常用方式
- 通过method(GET,POST,PUT等)方式传参---restful API思想
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 from flask import Flask,render_template,request 5 6 app=Flask(__name__) 7 @app.route('/task/',methods=['GET','POST','PUT']) 8 def task_list(): 9 if request.method == 'GET': # get请求,http://ip:port/task?name=guanqing 10 name = request.args.get("name") # request.args.get('key')获取get请求传来的参数 11 elif request.method == 'POST' # post请求:curl http://ip:port/task/ -d "name=guanqing" -X POST 12 name = reqeust.form.get('name') # request.form.get('key')获取post请求传来的参数 13 elif request.method == 'PUT' # PUT 请求:curl http://ip:port/task/ -d "name=guanqing" -X PUT 14 name = request.form.get('name') # 同POST方式 15 return "User is %s" % name
- 定义函数形参与URL变量传参(可结合不定长参数)--- url变量名必须和绑定的函数的形参一致
1 @app.route('/task/<string:username>/') # curl http://ip:port/task/guanqing/ 2 def task_detail(username): 3 return "User is %s" % username 4 5 @app.route('/task/<string:username>/',methods=['GET','POST','PUT']) # 函数参数+method传参 6 def task(username): 7 if request.method == 'GET': 8 age = request.args.get('age') 9 elif request.method == 'POST': 10 age = request.form.get('age') 11 elif request.method == 'PUT': 12 age = request.form.get('age') 13 return "User is %s, and age is %s" % (username,age) 14 15 if __name__=='__main__': 16 app.debug=True 17 app.run(host='0.0.0.0',port=5001)
- 应用场景
- 第一种通过method请求传参的方式的结果 --- api,ajax等场景用的比较多
1 $curl http://192.168.1.251:5001/task/?name=guanqing 2 User is guanqing 3 4 注意:多个参数 curl "http://192.168.1.251:5001/task/?name=guanqing&age=28" 5 多个参数用&连接,在shell中&属于特殊字符,故curl请求时,需要加 “” 6 7 $curl http://192.168.1.251:5001/task/ -d "name=guanqing" -X PUT 8 User is guanqing 9 10 # 多个参数,-d “name=guanqing&age=28”
- 第二种通过定义函数形参的方式的结果 --- web场景用的
1 $curl http://192.168.1.251:5001/task/guanqing User is guanqing
- jinja2模板 -- 基本应用
- jinja2相关的官方链接
1 http://niwibe.github.io/django-jinja/ 官网 2 http://docjinkan.org/docs/jinja2/ 中文文档 3 http://jinja.pocoo.org/docs/dev/intro/ 英文版 4 http://www.oschina.net/question/5189_3943 不明觉厉 5 http://www.pythonfan.org/docs/python/jinja2/zh/templates.html 中文官方文档,详细
- jinja2相关的概述以及介绍和安装
1 介绍: 2 Jinja是基于python语言实现的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker和velocity。 3 4 模板语言: 5 一种被设计出来自动生成文档的简单文本格式。模版语言中,把一些变量传给模版,替换模版特定位置上预先定义好的展位变量名。其中{{}}来渲染变量,{%%}定义控制代码如if,for等 6 7 运行需求: 8 Jinja2需要Python2.4以上的版本。 9 安装: 10 按照Jinja有多种方式,你可以根据需要选择不同的按照方式。 flask和Django框架中自带来jinja2模版 11 Python安装: 12 #sudo easy_install Jinja2 13 #sudo pip install Jinja2
- jinja2的基本语法
- 获取普通变量的值
后端传来的是单个字符串或数字变量: eg: user=“guanqing” {{% user %}} - 获取对象的值
1 后端传来的是列表: eg:user=['guanqing',28] 2 调用: {{user[0]}} # 列表元素个数是不确定的,实际生产中用for循环 3 4 后端传来的是单个字典: eg: user={'name':'guanqing','age':28} 5 调用: {{user.name}} 或 {{user['name']}}
- for循环语句
1 for 循环语句: 2 字典的for循环 3 users={'name':'guanqing','age':28,‘name’:‘wukun’,‘age’:30} 4 {% for k,v in users.iteritems() %} 5 <li><a data={{k}}>{{v}}</a></li> 6 {% endfor %} 7 8 列表的for循环 9 users=['zhangsan','lisi','wangwu'] 10 {% for user in users %} 11 <li>{{user}}</li> 12 {% endfor %} 13 14 列表中嵌套字典 ---- 非常常用 15 result=[{'name':'guanqing','age':28,‘name’:‘wukun’,‘age’:30}] 16 {% for user in result %} 17 <li>{{user['name']}}</li> 18 <li>{{user.age}}</li> 19 {% endfor %}
- if语句
1 {% if user %} 2 …… 3 {% else %} 4 …… 5 {% endif %} 6 7 8 eg: 9 <td><strong> 10 {% if result.role==0 %} 11 超级管理员 12 {% else %} 13 普通用户 14 {% endif %} 15 </strong></td>
- jinja2语法的在实际生产中的使用实例 --- jinja2的数据在js中调用的方式和html中一样
- 后端处理部分,传给前端一个数据
1 cat app.py 2 @app.route("/user/list",methods=['GET','POST']) 3 def user_list(): 4 result=[{'id':1,'name':'guanqing','email':'guanqing@qq.com','role':0},{'id':2,'name':'wukun','email':'wukun@163.com','role':1}] # 列表中套字典的使用场景很多 5 return render_template('user_list.html',users=result) # 将数据传jinja2模板
- 前端HTML接受数据并渲染
1 cat user_list.html 2 <table class="table table-bordered table-striped"> 3 <thead> 4 <tr> 5 <th scope="col">姓名</th> 6 <th scope="col">Email</th> 7 <th scope="col">操作</th> 8 </tr> 9 </thead> 10 <body> 11 {% for user in users %} # 循环遍历列表 12 <tr id="_con_tr" class="odd gradeX"> 13 <td>{{user['name']}}</td> 14 <td>{{user['email']}}</td> # 获取到每次遍历列表字典对应的值 15 <td>{% if user['role'] == 0 %}超级管理员{%else}普通用户{% endif %}</td> 16 <td> 17 # 涉及到了更新,删除操作就需要知道该条记录的ID,就给对应的按钮加一个属性,值为id 18 <button class='btn btn-primary btn-sm' data-id='{{user['id']}}'>更新</button> 19 <button class='btn btn-primary btn-sm' data-id='{{user['id']}}'>删除</button> 20 </td> 21 </tr> 22 {% endfor %} 23 </body> 24 </table>
- 未完。

浙公网安备 33010602011771号