最近接手了一个flask轻型框架,之前接触过一点点flask也只是为了做题,没有太深入研究过一些原理架构等细节。
这里简单介绍一下windows平台下的flask框架。MacBook请参考[(https://evoa.me/index.php/archives/47/ "flask快速开发")
    1. 平台搭建。
  操作系统:window 7  64bit  数据库:mysql5.6  python:v2.7  开发集成软件:PyCharm5.0
  - 安装flask环境:
  打开windows的命令行:pip install flask
  - 安装flask-sqlalchemy包
  打开cmd 输入E:\workdir\blog2>pip install flask-sqlalchemy

E:\workdir\blog2>python
Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on wi
n32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>>
>>> from flask_sqlalchemy import SQLAlchemy
>>>
>>>


flask框架已经搭好。

  2.简单程序

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
E:\workdir\blog2>python
Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on wi
n32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>>
>>> from flask_sqlalchemy import SQLAlchemy
>>>
>>>

 
URL中输入http://127.0.0.1:5000/
 flask开发笔记 随笔


此程序现在仅可在本地运行,如果想在其他ip上运行需输入app.run(host='0.0.0.0')这是在公网ip在运行。
@app.route在此处相当于发挥了一个路由器的作用。```python

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello World'
```

由于现在的web开发结构庞大,内容复杂,因此会在网站根目录分很多类,例如
app/admin,app/login,app/reset ,route功能即可将不同的文件分配到不同的子目录中。

变量规则

@app.route(<varial>) route()内的名称即为变量名。

构造 URL

如果 Flask 能匹配 URL,也可以生成。 url_for() 来给指定的函数构造 URL。它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数。

from flask import Flask,url_for
app = Flask(__name__)

@app.route('/')
def index():pass

@app.route('/login')
def login():pass

@app.route('/user/<username>')
def profile(username): pass

with app.test_request_context():
    print url_for('index')
    print url_for('login')
    print url_for('login',next='/')
    print url_for('profile',username='hsy')
/
/login
/login?next=%2F
/user/hsy

反向构建通常比硬编码的描述性更好。更重要的是,它允许你一次性修改 URL, 而不是到处边找边改。

生成URL还可以进行HTTP请求,(post&get)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

更改路由请求的方式在app.route中修改。

静态文件

有时在调用文件时需要调用css,html等前端渲染模板,因此直接使用static静态文件即可调用。

url_for('static', filename='style.css')

模板渲染
from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

Flask 会在 templates 文件夹里寻找模板。所以,如果你的应用是个模块,这个文件夹应该与模块同级;如果它是一个包,那么这个文件夹作为包的子目录:

1.模块

/application.pyj
/templates
    /hello.html

2.包

/application
    /__init__.py
    /templates
        /hello.html

 

环境局部变量

from flask import request

with app.test_request_context('/hello', method='POST'):
    # now you can do something with the request until the
    # end of the with block, such as basic assertions:
    assert request.path == '/hello'
    assert request.method == 'POST'

 

request模块

from flask import request

@app.route('/login',methods=['POST','GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
    return log_the_user_in(request.form['username'])
        else:
    error = 'Invalid username/password'
    return render_template('login.html',error=error)

Cookie:

  • 读取cookie
from flask import request

@app.route('/')

def index():
    username=request.cookies.get('username')
    
  • 存储cookie
from flask import make_response

@app.route('/')

def index():
    resp = make_response(render_templete(...))
    resp.set_cookie('username','the username')
    return resp

响应

from flask import make_response

@app.errorhandler(404)

def not_found(error):
    resp=make_response(render_template('error.html'),404)
    resp.headers['X-Something']='A value'
    return resp

 

session:

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
        <form action="" method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''

@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('index'))

# set the secret key.  keep this really secret:
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

用蓝图实现模块化的应用

  
from flask import Blueprint,render_template,abort
from jinja2 import TemplateNotFound

simple_page = Blueprint('simple_page',__name__,
                        template_folder='templetes')

@simple_page.route('/',defaults={'page':'index'})
@simple_page.route('/<page>')
def show(page):
    try:
        return render_template('pages/%s.html'%page)
    except TemplateNotFound:
        abort(404)
 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄