Flask学习总结

简介

Flask是基于python开发的一个基于MVC设计模式的、微内核的web开发框架。它小巧轻量特别适合于各种小型python web开发。当然,它应对大型项目也不在话下。Flask有着丰富的扩展,它本身只依赖两个外部库jinjia2模板引擎以及WerkzeugWSGI工具集。因此有ORM或者表单之类需求的可以根据需求自己增加扩展。

新建flask应用

新建一个python文件(如:hello.py, 不能为flask.py),在文件中写入以下代码:

 from flask import Flask

 app = Flask(__name__)

 @app.route("/")

 def hello():

  return "Hello World!"

 if __name__ == "__main__":

  app.run()

然后执行python hello.py,在浏览器访问http://127.0.0.1:5000/ 就可以看到 Hello World!,表示你已经完成了一个最简单的Flask应用。

1.from flask import Flask在这里从flask包里导入了Flask类, 该类的实例是我们的WSGI(Web Server Gateway Interface Web服务网关接口)应用程序。

2.app = Flask(__name__) 这里是创建了一个Flask的实例, Flask的第一个参数必须是你创建的应用模块或者包的名称。所以你应该传入__name__。

3.app.route(‘URL’)就是在Flask框架中非常重要的一个装饰器,它的作用是在程序运行时,装饰一个视图函数,用给定的URL规则和选项注册它。@app.route("/")这里是使用了route()装饰器将url和视图函数连接起来,即在什么样的URL下触发哪一个视图函数。如该例中, 我们的地址是127.0.0.1:5000,当在浏览器访问到http://127.0.0.1:5000/ 是就会触发 hello()执行相关操作。

4.app.run()这条语句是运行这个应用, if __name__ == "__main__":这条语句判断了是这个文件或者包是否是主程序的入口,还是作为一个包导入,类似于c语言的int main()。

调试模式

方法一:在应用对象上设置

 app.debug = True

 app.run()

方法二:作为参数传递给run()方法

app.run(debug=True)

路由

应用中的route("/")装饰器将一个方法绑定到某一个指定的URL上就叫做路由。在URL中可以添加变量,<variable_name>标记变量的名字, 可以作为命名参数传递到视图函数中使用。可根据规则<converter:variable_name>来指定一个可选的转换器。如:

@app.route("/<name>/")
 def print_name(name):

    return "名字是:%s" % name
 ​
 @app.route("/<int:age>/")
 def print_age(age):

    return "年龄是:%d" % age 

 @app.route("/<float:height>/")
 def print_height(height):

    return "身高是:%s" % height

url_for()方法可以构造一个url。该方法的第一个参数是str类型,是一个试图函数名, 后面可添加在url中声名的命名参数,或者get请求的其他参数。

 from flask import url_for
 @app.route("/hello/")

 def hello(height):

    return "hello"


 @app.route("/yourname/<name>/")
 def print_name(name):

    return "名字是:%s" % name


 @app.route("/yourage/")
 def print_age():

    return "年龄是:%s" % request.args.get("age", "18")

 print(url_for('hello'))
 print(url_for('print_name', name="Mike"))
 print(utl_for('print_age', age=20))

HTTP方法

HTTP方法常见的有:

GET:获取页面信息,通过?参数名=值&参数名=值...传递数据;

POST:通常是html通过表单给服务器传数据的方法;

HEAD:获取消息头;

PUT:与POST类似,但是服务器可能触发了存储过程多次,多次覆盖掉旧值。

DELETE:删除给定位置的信息;

OPTIONS:给客户端提供一个敏捷的途径来弄清这个 URL 支持哪些 HTTP 方法。

可以在route('/',methods=[])methods中指定允许的请求方法。默认为“GET”方法。

@app.route('/', methods=["GET", "POST"])def hello():

    pass

页面跳转和重定向

重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。

永久性重定向:http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。

暂时性重定向:http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。

在flask中,重定向是通过flask.redirect(location,code=302)这个函数来实现的,location表示需要重定向到的URL,应该配合之前讲的url_for()函数来使用,code表示采用哪个重定向,默认是302也即暂时性重定向,可以修改成301来实现永久性重定向。

类视图

我们接触的视图都是函数,所以一般简称视图函数。其实视图也可以基于类来实现,类视图的好处是支持继承,但是类视图不能跟函数视图一样,写完类视图还需要通过app.add_url_rule(url_rule,view_func)来进行注册。

一、标准类视图:

标准类视图是继承自flask.views.View,并且在子类中必须实现dispatch_request方法,这个方法类似于视图函数,也要返回一个基于Response或者其子类的对象。

from flask.views import View

class PersonalView(View):

    def dispatch_request(self):

        return "hello world!"

类视图通过add_url_rule方法和url做映射

app.add_url_rule('/users/',view_func=PersonalView.as_view('personalview'))

二、基于调度方法的视图:

Flask还为我们提供了另外一种类视图flask.views.MethodView,对每个HTTP方法执行不同的函数(映射到对应方法的小写的同名方法上)

class LoginView(views.MethodView):

    # 当客户端通过get方法进行访问的时候执行的函数

    def get(self):

        return render_template("login.html")

    # 当客户端通过post方法进行访问的时候执行的函数

    def post(self):

        email = request.form.get("email")

        password = request.form.get("password")

        if email == 'xx@qq.com' and password == '111111':

            return "登录成功!"

        else:

            return "用户名或密码错误!"

# 通过add_url_rule添加类视图和url的映射,并且在as_view方法中指定该url的名称,方便url_for函数调用

app.add_url_rule('/myuser/',view_func=LoginView.as_view('loginview'))

蓝图

随着Flask项目越来越复杂,把所有视图函数放在一个应用文件中会很不方便我们管理,所以需要对程序进行模块化的处理。Flask内置了一个模块化处理的类——Blueprint蓝图。Blueprint 是一种组织一组相关视图及其他代码的方式。与把视图及其他代码直接注册到应用的方式不同,蓝图方式是把它们注册到蓝图,然后在工厂函数中把蓝图注册到应用。

首先我们在user包中创建一个视图函数文件名为view,代码如下所示:

from flask import Blueprint

user_bp= Blueprint('user',__name__)

首先导入Blueprint包,再通过Blueprint()方法来定义变量user_bp为蓝图对象。

init.py初始化文件代码如下所示:

from flask import Flask
from apps.user.view import user_bp
​
def create_app():
    app=Flask(__name__,template_folder='../templates',static_folder='../static')

    #蓝图
    app.register_blueprint(user_bp)

return app

首先我们导入user中的view对象user_bp,自定义函数create_app()并创建一个app对象,然后通过app.register_blueprint()方法将蓝图对象绑定在app对象上。

注意:由于init.py初始化文件与static静态文件、templates模板文件不在同一级,所以需要重新指定静态文件与模板文件的位置。

接下来编写app.py启动文件,代码如下所示:

from flask import Flask
from apps.user.view import user_bp

def create_app():
    app=Flask(__name__,template_folder='../templates',static_folder='../static')

    #蓝图
    app.register_blueprint(user_bp)

return app

以上面的view视图函数文件为例,其代码内容如下所示:

from flask import Blueprint, request, render_template, redirect
from apps.user.model import User

user_bp= Blueprint('user',__name__)        #蓝图对象

@user_bp.route('/')

def hello():

    return '你好'

与之前的在app.py中写视图函数将比,将之前的@app.route()改为蓝图对象名.route(),其他的就几乎一样。

cookie和session

cookie:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。

session: session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器,不同的服务器,不同的框架,不同的语言有不同的实现。虽然实现不一样,但是他们的目的都是服务器为了方便存储数据的。session的出现,是为了解决cookie存储数据不安全的问题的。

cookie和session结合使用:web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:

1、存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。

2、将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式。

1、cookies:在Flask中操作cookie,是通过response对象来操作,可以在response返回之前,通过response.set_cookie来设置,这个方法有以下几个参数需要注意:

key:设置的cookie的key。

value:key对应的value。

max_age:改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期。

expires:过期时间,应该是一个datetime类型。

domain:该cookie在哪个域名中有效。一般设置子域名,比如cms.example.com。

path:该cookie在哪个路径下有效。

2、session:Flask中的session是通过from flask import session。然后添加值key和value进去即可。并且,Flask中的session机制是将session信息加密,然后存储在cookie中。专业术语叫做client side session。

Restful API规范

restful api是用于在前端与后台进行通信的一套规范。使用这个规范可以让前后端开发变得更加轻松。

1)协议:采用http或者https协议。

2)数据传输格式:数据之间传输的格式应该都使用json,而不使用xml。

3)url链接:url链接中,不能有动词,只能有名词。并且对于一些名词,如果出现复数,那么应该在后面加s。

比如:获取文章列表,应该使用articles,而不应该使用get_article

4)HTTP请求的方法:

GET:从服务器上获取资源。

POST:在服务器上新创建一个资源。

PUT:在服务器上更新资源。(客户端提供所有改变后的数据)

PATCH:在服务器上更新资源。(客户端只提供需要改变的属性)

DELETE:从服务器上删除资源。

示例如下:

GET /users/:获取所有用户。

POST /user/:新建一个用户。

GET /user/id/:根据id获取一个用户。

PUT /user/id/:更新某个id的用户的信息(需要提供用户的所有信息)。

PATCH /user/id/:更新某个id的用户信息(只需要提供需要改变的信息)。

DELETE /user/id/:删除一个用户。

5)状态码:

200 OK 服务器成功响应客户端的请求。

400 INVALID REQUEST 用户发出的请求有错误,服务器没有进行新建或修改数据的操作

401 Unauthorized 用户没有权限访问这个请求

403 Forbidden 因为某些原因禁止访问这个请求

404 NOT FOUND 用户发送的请求的url不存在

406 NOT Acceptable 用户请求不被服务器接收(比如服务器期望客户端发送某个字段,但是没有发送)。

500 Internal server error 服务器内部错误,比如出现了bug

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值