zoukankan      html  css  js  c++  java
  • Flask框架(一)

    一、flask简介

    1.1什么是flask?

    Flask是一个python编写的web微框架,使用flask我们可以使用python快速实现一个网站或web服务。

    1.2Django、flask、tornado三大框架的对比

    Django

    Django是同步框架,orm和模板都是自己的,使用Django可以快速开发一个比较大的项目。该框架内置模块很多,模板、表单、路由、数据库管理等功能都可以通过这些模块实现。

    优点:内置大量模块,可以通过这些模块去实现功能,减少开发者的代码量。

    缺点:由于内置模块太多,项目占内存比较大,不适合实现功能较少的小项目。

    flask

    flask是同步框架,orm不是自己的、模板使用jinjia2模板,适用于小项目,也能做大项目但有些东西需要使用第三方组件或者自己写。

    torando

    异步框架、微框架、高性能,适用于大量连接、长轮询、WebSockets的应用。

    二、环境的准备

    2.1搭建虚拟环境

    虚拟环境是隔离的Python解释器环境。通过创建虚拟环境,你可以拥有一个独立的Python解释器环境,相当于对全局的python解释器环境拷贝一份私有的副本, 这样做的好处是可以为每一个项目创建独立的Python解释器环境,因为不同的项目常常会依赖不同版本的库或Python版本。

    2.1.1方式一:使用pycharm创建

    如下图所示新建项目的时候选择虚拟环境。

    2.1.2方式二:命令行搭建虚拟环境

    windows的开发环境的安装过程,我们使用的是virtualenv虚拟开发环境,首先安装相关包的依赖

    pip install virtualenvwrapper-win
    

    利用安装好的模块我们创建一个虚拟环境

    注意:这个‘’first_01_env‘’ 是我们自己给虚拟环境取的名字,并且要记录一下图(1)的安装路径,一会我们需要使用。

    mkvirtualenv first_01_env  
    

    虚拟环境其他相关命令
    01、切换到指定的虚拟环境:注意我们进入虚拟环境是需要用workon命令,但是首次安装成功会自动进入虚拟环境。

    workon first_01_env
    

    02、退出虚拟环境

    deactivate
    

    03、删除指定的虚拟环境

    rmvirtaulenv first_01_env
    

    04、列出所有虚拟环境:

    lsvirtualenv
    

    05、进入到虚拟环境所在的目录:

    cdvirtualenv
    

    2.1.3安装Flask模块

    创建好虚拟环境然后执行:

    pip install flask
    

    三、基础介绍

    3.1flask框架起步与flask框架四剑客

    from flask import Flask#导入flask类
    app = Flask(__name__)#实例化一个Flask对象
    

    __name__是模块的名称或者包的名称
    作用: 根据这个参数确定flask应用的路径, 从而快速查找模板和html文件的默认路径;也可以说这里的app就是一个程序实例,客户端(一般是浏览器)将请求发送给服务端Web服务器,Web服务器再把请求发给Flask实例。

    3.2Response四剑客

    类似于Django的response,flask也有四种响应方式

    1.直接返回字符串,类似于Django的HttpResponse

    2.返回一个HTML页面使用render_template,类似于Django的render

    3.重定向,用于页面的跳转:redirect

    4.将序列化的数据转换为json类型返回到前端:jsonify

    from flask import Flask,render_template,redirect,jsonify
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        return "ok"
    
    @app.route("/index")
    def index1():
        return render_template("index.html")
    
    
    @app.route("/login")
    def index2():
        return  redirect("/")
    
    
    @app.route("/test")
    def json11():
        data ={'test1':"T1",'test2':"Test2"}
    
        return jsonify(data)
    
    
    
    if __name__ == '__main__':
        app.run()
    
    

    3.3flask的配置文件

    3.3.1方式一(app属性的方式)

    它只能配置两项,一个是debug 一个secert_key

    app.debug=True
    

    3.3.2方式二(app.config字典的形式)

    app.config["DEBUG"] =True
    

    3.3.3方式三(以一个py文件作为配置文件)

    app.config.from_pyfile("setting.py")
    

    我们可以在settings.py中写配置代码。

    3.3.4方式四(以类的形式,推荐使用)

    app.config.from_object("settingobj.TestConfig")
    

    settingsobj是一个独立的py文件,我们在这个文件中以类的形式定义配置,这样当我们需要使用哪项配置时直接settingobj.类名就可以了。

    class Config:
        DEBUG = False
    
    class ProductConfig(Config):
        pass
    
    class TestConfig(Config):
        DEBUG =  True
    

    3.4路由的本质以及add_urll_rule参数

    flask通过@app.route("路由后半部分"),route内部代码会将其余前面的url拼接成一条完整的路由。

    from  flask import  Flask,url_for
    
    app = Flask(__name__)
    
    # @app.route("/")
    def index():
        return "ok"
    
    

    @app.route("/")和底下的app.add_url_rule一样。

    如果写成下面的形式,就相当于django中的url文件。

    add_url_rule参数中的endpoint的作用:是做反向解析

    methods=["POST","GET"]) 这里的methods用来限制请求方式。

    app.add_url_rule("/index2/<int:yy>",view_func=index2)有名分组,yy用于接收参数。在flask中只有有名分组。

    app.add_url_rule("/", view_func=index,endpoint="index12333444",methods=["POST","GET"])
    
    def index1():
        print(url_for("index12333444"))
        return "123"
    
    app.add_url_rule("/index1",view_func=index1,strict_slashes=False,redirect_to="/index2")
    
    
    def index2(yy):
        print(yy)
        return "123445"
    #只有有名分组
    app.add_url_rule("/index2/<int:yy>",view_func=index2)
    if __name__ == '__main__':
        app.run()
    

    3.5路由正则

    步骤:

    1.写类,继承BaseConverter
    2.注册:app.url_map.converters['regex'] = RegexConverter
    3.使用:@app.route('/index/<regex("d+"):nid>') 正则表达式会当作第二个参数传递到类中

    from flask import Flask, views, url_for
    from werkzeug.routing import BaseConverter
    
    app = Flask(import_name=__name__)
    
    class RegexConverter(BaseConverter):
        """
        自定义URL匹配正则表达式
        """
        def __init__(self, map, regex):
            super(RegexConverter, self).__init__(map)
            self.regex = regex
    
        def to_python(self, value):
            """
            路由匹配时,匹配成功后传递给视图函数中参数的值
            """
            print("to_python",type(value),value)
            return int(value)
    
        def to_url(self, value):
            """
            使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
            """
            print("to_url", type(value), value)
            val = super(RegexConverter, self).to_url(value)
            return val+"123"
    # 添加到flask中
    app.url_map.converters['regex'] = RegexConverter
    @app.route('/index/<regex("d+"):nid>')
    def index(nid):
        print("nid",type(nid),nid)
        print(url_for('index', nid='888'))
        return 'Index'
    
    if __name__ == '__main__':
        app.run()
    

    3.6flask的cbv写法

    from  flask import Flask,views,url_for
    app = Flask(__name__)
    
    #如果继承的是views.View必须实现 def dispatch_request(self):
    
    class IndexView(views.View):
        methods = ["POST","GET"]
        #decorators= ["装饰器的函数对象",]
        def dispatch_request(self):
            return "index"
    
    #app.add_url_rule("/index",view_func=view)(View中as_view函数中嵌套的view)
    app.add_url_rule("/index",view_func=IndexView.as_view(name="index"))
    
    class LoginView(views.MethodView):
        def post(self):
            return "post"
        def get(self):
            print(url_for("123"))
            return  "get"
    
    app.add_url_rule("/login",view_func=LoginView.as_view(name="login"))
    
    if __name__ == '__main__':
        app.run()
    

    3.7模板渲染

    from flask import Flask,render_template,Markup
    app = Flask(__name__)
    
    def ff(arg,b):
        return  Markup(arg+b)
    
    @app.route("/")
    def index():
        a = 123
        list_info ={
            1:{"name":"TT","long":160,"颜值":50},
            2:{"name":"KK","long":170,"颜值":60},
            3:{"name":"GG","long":190,"颜值":80}
        }
        html ="<h1> TT is sb</h1>"
        return  render_template("index1.html",num=a,user_dic = list_info ,htm=html,ff=ff)
    
    if __name__ == '__main__':
        app.run()
    
    

    3.8flask的请求与响应

    from flask import Flask,request,render_template,redirect,jsonify,make_response
    
    app = Flask(__name__)
    
    @app.route("/")
    def inde():
        #请求相关的
        print("request.method",request.method)
        print("request.args",request.args)
        print("request.form",request.form)
        print("request.values",request.values)
    
        #响应相关的
        # response  = make_response("ojbk")
        response = make_response(render_template("index.html"))
        # response.set_cookie("name","TT is dsb")
        response.delete_cookie("name")
        response.headers["x-ssss"] = "jason is sb"
        return response
    
    if __name__ == '__main__':
        app.run()
    

    3.9flask的session操作

    3.9.1django的seesion使用步骤

    1.先产生一个随机的字符串,key

    2.存key-->session对应,存数据库

    3.把它key传到前端,设置cookies

    3.9.2flask的sessoin存的步骤

    第一步将session的这个字典做加密得到val,

    第二步将配置文件中SESSION_COOKIE_NAME作为key,

    第三步设置cookies,以上述的key,val做键值

    3.9.2flask的session取的步骤

    第一步,获取cookies中键为SESSION_COOKIE_NAME的值,

    第二步: 将第一步获取的值做解密操作得到真的val值

    from  flask import Flask,session
    app = Flask(__name__)
    app.secret_key = "aihsdasnd"
    app.config['SESSION_COOKIE_NAME']="sbd"
    
    

    3.10flask的闪现

    闪现的特点:
    1.没有设置,取是不会报错的,返回一个空列表
    2.设置了就可以在任何一个视图函数中去取
    3.取了一次就没有了。(但是在同一次请求中可以取多次)

    from flask import Flask,flash,get_flashed_messages
    
    app = Flask(__name__)
    app.secret_key="aosjdaois"
    @app.route("/")
    def index1():
        flash("Test1")
        return "333"
    
    @app.route("/index")
    def index():
        flash("Test2")
        flash("Test3","Key")
        return "123"
    
    @app.route("/login")
    def login():
        print(get_flashed_messages(with_categories=True))
        print(get_flashed_messages(category_filter=("Key")))
        return "ok"
    
    if __name__ == '__main__':
        app.run()
    
    
  • 相关阅读:
    工作计划
    bzoj3626:[LNOI2014]LCA
    bzoj3631:[JLOI2014]松鼠的新家
    bzoj3573: [Hnoi2014]米特运输
    bzoj4027,[HEOI2015]兔子与樱花
    bzoj3624,[Apio2008]免费道路
    bzoj2208连通数
    tyvj1153/洛谷P1262间谍网络
    Application server libraries not found && IntelliJ IDEA && tomcat
    debian9安装java8
  • 原文地址:https://www.cnblogs.com/ghylpb/p/12390565.html
Copyright © 2011-2022 走看看