zoukankan      html  css  js  c++  java
  • Flask初识

    Flask初识

    一丶Flask和Django比较

    ### Flask 是一个轻量级的框架. 
    	# 内置了: 路由 / 视图 / 模版(jinja2) / cookie /session 中间件	
    	# 第三方插件: wtforms / flask-session / flask-sqlalchemy
    
    ### Django 是一个Django内置了许多的功能 
    	# 内置了:admin / orm / 模版 / form / modelform / session / cookie / 缓存 /中间件 / 信号 / 数据库的读写分离 / 分页....
    	
    	
    ### 总结:	
    	flask短小精悍,适合小程序开发
    	Django适合中大型程序开发
    

    二丶Flask的‘入口’

    
    # 1. 安装flask
    	pip3 install flask
    
    # 2. flask 的 werkzeug
    	# werkzurg是一个wsgi,本质上提供了socket服务端,用于接收用户请求.
    
    	# django和flask一样,它们内部都没有实现socket服务端,需要依赖wsgi.
    
    
    # 3. werkzurg实现网站开发
    
    from werkzeug.wrappers import Response
    from werkzeug.serving import run_simple
    
    class Flask(object):
        '''
            # 面向对象的方式封装
        '''
        def __call__(self, *args, **kwargs):
            return Response('Hellow Werkzeug!!!')
    
    if __name__ == '__main__':
        app=Flask()
    
        run_simple('127.0.0.1',5000,app) # 第三个参数默认会加上括号执行,即调用类中的__call__方法
    

    三丶Flask程序

    from flask import Flask
    # 实例化一个app对象
    app=Flask(__name__)
    
    # 添加路由关系
    @app.route('/index')
    def index():
    	return 'hellow Flask'
    	
    if __name__=='__main__':
    	# 启动flask
    	app.run()
    

    四丶Flask的请求,路由,响应

    # 接收请求 request
    	# request.method 请求方法
    	# request.form   post方法提交的数据
    	# request.args   get方法提交的数据
    	
    # 返回响应 response
    	
    	# 返回字符串
    	 	return 'XXX' 
    	#  返回json
    		return jsonify({"k1":123})
    # 路由 , methods参数
    	@app.route('/login',methods=['GET','POST']) 
    
    # 返回模版 render_template 
    	# 模版资源放在templates文件夹下
    	# return render_template('模板文件',参数)
    	
    # 跳转 redict
    	return redirect(...)
    
    ### 登录校验
    # -*-coding:utf-8-*-
    # Author:Ds
    from flask import Flask, request, render_template, redirect, session, url_for
    import functools
    
    app=Flask(__name__)
    app.secret_key='1321312jkdsakljdls'
    
    def user_login_check(fn):
        @functools.wraps(fn)
        def inner(*args,**kwargs):
            print(inner)
            if not session.get('user-info'):
                return redirect(url_for('login'))
    
            return fn(*args,**kwargs)
        return inner
    
    @app.route('/login',methods=['GET','POST'])
    def login():
        if request.method=='GET':
            return  render_template('login.html')
    
        user=request.form.get('user')
        pwd= request.form.get('pwd')
        if user=='alex' and pwd=='123':
            session['user-info']=user
            return redirect('/index')
    
        return  render_template('login.html',error="用户或密码错误!!")
    
    @app.route('/index',methods=['GET','POST'])
    @user_login_check
    def index():
        # if not session.get('user-info'):
        #     return render_template('login.html')
    
        data=['alex','wusir','taibai','bangzhu']
        return render_template('index.html',data=data)
    
    
    @app.route('/order')
    @user_login_check
    def order():
        return  '订单'
    
    if __name__ == '__main__':
        app.run()
    
    # 模版语法
    	1. 基本用法与Django一致
    	2. jinja2的语法更趋向于python语法
    

    五丶session

    # 已加密的形式放在用户的浏览器中
    
    # 在flask中依赖secret_key,目的是保证session不被窃取
    
    from flask import Flask, request, render_template, redirect, session, url_for
    import functools
    
    app=Flask(__name__)
    app.secret_key='1321312jkdsakljdls'
    
    
    @app.route('/login',methods=['GET','POST'])
    def login():
        if request.method=='GET':
            return  render_template('login.html')
    
        user=request.form.get('user')
        pwd= request.form.get('pwd')
        if user=='alex' and pwd=='123':
            # 设置session 的值
            session['user-info']=user
            return redirect('/index')
    

    六丶装饰器认证

    # import functools 
    	- 位置route的下面
    	- 记得加functools.wraps(...) , 保留函数的元信息.
    	
    def user_login_check(fn):
        @functools.wraps(fn)
        def inner(*args,**kwargs):
            print(inner)
            if not session.get('user-info'):
                return redirect(url_for('login'))
    
            return fn(*args,**kwargs)
        return inner	
    
    # 总结: 如果不加functools.wraps,导致所有的函数名将会一致. 因为默认的endpoint将不能重名
    
    # 必须先走路由
    @app.route('/index',methods=['GET','POST'])
    @user_login_check
    def index():
        # if not session.get('user-info'):
        #     return render_template('login.html')
    
        data=['alex','wusir','taibai','bangzhu']
        return render_template('index.html',data=data)
    
    

    七丶flask的请求周期(充当中间件)

    before_request : 把所有的方法添加到一个列表,按照注册的顺序执行
    
    after_request : 把所有的方法 进行 reverse倒序后,再执行
    
    
    # -*-coding:utf-8-*-
    # Author:Ds
    
    from flask import Flask, request, render_template, redirect, session, url_for
    
    app=Flask(__name__)
    app.secret_key='1321312jkdsakljdls'
    
    @app.before_first_request # 只调用一次
    def f1():
        print('f1')
    
    
    @app.before_request 
    def f2():
        print('f2')
    
    
    @app.after_request
    def f3(response):
        print('f3')
        return response
    
    
    @app.after_request
    def f4(response):
        print('f4')
        return response
    
    
    @app.route('/login',methods=['GET','POST'])
    def login():
        print('login')
        return 'login'
    
    
    if __name__ == '__main__':
        app.run()
        
    # 结果: f1 f2 login f4  f3    
    
  • 相关阅读:
    C#操作Word完全功略
    Ubuntu安装BackExec Remote Agent for Linux
    curl快速实现网速测试
    GitHub已将持续集成服务器Janky开源
    串行(Sequential)、并发(Concurrent)、并行(parallel)与分布式(distributed)
    使用ld的wrap选项替换已有库函数
    Linux获取程序编译参数
    配置Apache+Tomcat实现SSO(单点登录)
    ipad+Blackberry构建临时网络访问
    巧解 JavaScript 中的嵌套替换
  • 原文地址:https://www.cnblogs.com/dengz/p/12307659.html
Copyright © 2011-2022 走看看