Flask框架(一)

2020-03-19 15:44:54 浏览数 (1)

目录

  • 一、flask简介
    • 1.1什么是flask?
    • 1.2Django、flask、tornado三大框架的对比
  • 二、环境的准备
    • 2.1搭建虚拟环境
  • 三、基础介绍
    • 3.1flask框架起步与flask框架四剑客
    • 3.2Response四剑客
    • 3.3flask的配置文件
    • 3.4路由的本质以及add_urll_rule参数
    • 3.5路由正则
    • 3.6flask的cbv写法
    • 3.7模板渲染
    • 3.8flask的请求与响应
    • 3.9flask的session操作
    • 3.10flask的闪现

一、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虚拟开发环境,首先安装相关包的依赖

代码语言:javascript复制
pip install virtualenvwrapper-win

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

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

代码语言:javascript复制
mkvirtualenv first_01_env  

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

代码语言:javascript复制
workon first_01_env

02、退出虚拟环境

代码语言:javascript复制
deactivate

03、删除指定的虚拟环境

代码语言:javascript复制
rmvirtaulenv first_01_env

04、列出所有虚拟环境:

代码语言:javascript复制
lsvirtualenv

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

代码语言:javascript复制
cdvirtualenv
2.1.3安装Flask模块

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

代码语言:javascript复制
pip install flask

三、基础介绍

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

代码语言:javascript复制
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

代码语言:javascript复制
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

代码语言:javascript复制
app.debug=True
3.3.2方式二(app.config字典的形式)
代码语言:javascript复制
app.config["DEBUG"] =True
3.3.3方式三(以一个py文件作为配置文件)
代码语言:javascript复制
app.config.from_pyfile("setting.py")

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

3.3.4方式四(以类的形式,推荐使用)
代码语言:javascript复制
app.config.from_object("settingobj.TestConfig")

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

代码语言:javascript复制
class Config:
    DEBUG = False

class ProductConfig(Config):
    pass

class TestConfig(Config):
    DEBUG =  True

3.4路由的本质以及add_urll_rule参数

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

代码语言:javascript复制
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中只有有名分组。

代码语言:javascript复制
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>') 正则表达式会当作第二个参数传递到类中

代码语言:javascript复制
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写法

代码语言:javascript复制
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模板渲染

代码语言:javascript复制
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的请求与响应

代码语言:javascript复制
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值

代码语言:javascript复制
from  flask import Flask,session
app = Flask(__name__)
app.secret_key = "aihsdasnd"
app.config['SESSION_COOKIE_NAME']="sbd"

3.10flask的闪现

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

代码语言:javascript复制
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()

0 人点赞