Python - flask初始

flask初始

django是个大而全的框架,flask是一个轻量级的框架。

django内部为我们提供了非常多的组件:orm / session / cookie / admin / form / modelform / 路由 / 视图 / 模板 /  中间件 / 分页 / auth / contenttype  / 缓存 / 信号 / 多数据库连接 

flask框架本身没有太多的功能:路由/视图/模板(jinja2)/session/中间件 ,第三方组件非常齐全。flask没有orm本身需要使用pymsql来操作数据库写原生sql 
注意:django的请求处理是逐一封装和传递; flask的请求是利用上下文管理来实现的。 

1.flask快速使用

安装

pip3 install flask

1.1 依赖wsgi Werkzeug

from werkzeug.serving import run_simple

def func(environ, start_response):
    print('请求来了')
    pass

if __name__ == '__main__':
    run_simple('127.0.0.1', 5000, func)
from werkzeug.serving import run_simple

class Flask(object):
    
    def __call__(self,environ, start_response):
        return "xx"
app = Flask()

if __name__ == '__main__':
    run_simple('127.0.0.1', 5000, app)
    
from werkzeug.serving import run_simple

class Flask(object):
    
    def __call__(self,environ, start_response):
        return "xx"
    
    def run(self):
        run_simple('127.0.0.1', 5000, self)
        
app = Flask()

if __name__ == '__main__':
    app.run()

1.2 快速使用flask

from flask import Flask

# 创建flask对象
app = Flask(__name__)

@app.route('/index')
def index():
    return 'hello world'


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

if __name__ == '__main__':
    app.run()

总结:

  • flask框架是基于werkzeug的wsgi实现,flask自己没有wsgi。
  • 用户请求一旦到来,就会之 app.__call__ 方法 。
  • 写flaks标准流程

1.3 用户登录&用户管理

from flask import Flask, render_template, jsonify,request,redirect,url_for

app = Flask(__name__)

DATA_DICT = {
    1: {'name':'哈哈',"age":73},
    2: {'name':'啊啊',"age":84},
}

@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'GET':
        # return '登录' # HttpResponse
        # return render_template('login.html') # render
        # return jsonify({'code':1000,'data':[1,2,3]}) # JsonResponse
        return render_template('login.html')
    user = request.form.get('user')
    pwd = request.form.get('pwd')
    if user == 'changxin' and pwd == "dsb":
        return redirect('/index')
    error = '用户名或密码错误'
    # return render_template('login.html',**{'error':error})
    return render_template('login.html',error=error)

@app.route('/index',endpoint='idx')
def index():
    data_dict = DATA_DICT
    return render_template('index.html',data_dict=data_dict)

@app.route('/edit',methods=['GET','POST'])
def edit():
    nid = request.args.get('nid')
    nid = int(nid)

    if request.method == "GET":
        info = DATA_DICT[nid]
        return render_template('edit.html',info=info)

    user = request.form.get('user')
    age = request.form.get('age')
    DATA_DICT[nid]['name'] = user
    DATA_DICT[nid]['age'] = age
    return redirect(url_for('idx'))

@app.route('/del/<int:nid>')
def delete(nid):
    del DATA_DICT[nid]
    # return redirect('/index')
    return redirect(url_for("idx"))

if __name__ == '__main__':
    app.run()

总结

  1. flask路由

    @app.route('/login',methods=['GET','POST'])
    def login():
    	pass
    
  2. 路由的参数

    @app.route('/login',methods=['GET','POST'],endpoint="login")
    def login():
    	pass
    	
    # 注意:endpoint不能重名
    
  3. 动态路由

    @app.route('/index')
    def login():
    	pass
    	
    @app.route('/index/<name>')
    def login(name):
    	pass
    	
    @app.route('/index/<int:nid>')
    def login(nid):
    	pass
    
  4. 获取提交的数据

    from flask import request
    
    @app.route('/index')
    def login():
    	request.args # GET形式传递的参数
    	request.form # POST形式提交的参数
    
  5. 返回数据

    @app.route('/index')
    def login():
    	return render_template('模板文件')
    	return jsonify()
    	reutrn redirect('/index/') # reutrn redirect(url_for('idx'))
    	return "...."
    
  6. 模板处理

    {{ x }}
    {% for item in list %}
    	{{item}}
    {% endfor %}
    
    

1.4 保存用户会话信息

import functools
from flask import Flask, render_template, jsonify,request,redirect,url_for,session

app = Flask(__name__)

app.secret_key = 'uo3kj9sd78ij3l4kj9sd87fj'

DATA_DICT = {
    1: {'name':'哈哈',"age":73},
    2: {'name':'啊啊',"age":84},
}


def auth(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        username = session.get('xxx')
        if not username:
            return redirect(url_for('login'))
        return func(*args,**kwargs)
    return inner


@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'GET':
        # return '登录' # HttpResponse
        # return render_template('login.html') # render
        # return jsonify({'code':1000,'data':[1,2,3]}) # JsonResponse
        return render_template('login.html')
    user = request.form.get('user')
    pwd = request.form.get('pwd')
    if user == 'changxin' and pwd == "dsb":
        session['xxx'] = 'changxin'
        return redirect('/index')
    error = '用户名或密码错误'
    # return render_template('login.html',**{'error':error})
    return render_template('login.html',error=error)

2. 蓝图(blue print)

构建业务功能可拆分的目录结构。

总结

  1. flask和django的区别
  2. 其他
  3. flask的session是保存在:加密的形式保存在浏览器的cookie上。
  4. 装饰器相关
    • 编写装饰器,记得加functools
    • 多个装饰器的应用
  5. 蓝图
  6. 没有orm必须使用pymysql操作数据库写原生sql
posted @ 2020-08-05 13:45  赵刚、  阅读(132)  评论(0编辑  收藏  举报