flask基本介绍

一、Flask概述

1、什么是Web Framework?

  Web Application Framework(web应用程序框架)或简单的Web Framework(web框架)表示一个库和模块的集合,使web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等极地细节。

2、WSGI

  Web Server Gateway Interface(web服务器网关接口,WSGI),已被用作python web应用程序开发的标准,WSGI是Web服务器和Web应用程序之间通用接口的规范。

3、什么是Flask?

  Flask是一个用python编写的Web应用程序框架,其基于Werkzeug WSGI工具包和Jinja2模版引擎。

4、Werkzeug

  它是一个WSGI工具包,它实现了请求,响应对象和实用函数。这使得能够在其上构建web框架。Flask框架是Werkzeug作为其基础之一。

5、Jinja2

  Jinja2是Python的一个流行的模板引擎。Web模板系统将模板与特定数据源组合以呈现动态网页。

Flask通常被称为微服务,它目的在保持应用程序的核心简单且可扩展。

 

二、Flask HTTP方法

  HTTP协议是万维网中数据通信的基础,在该协议中定义了从指定URL检索数据的不同方法。

序号 方法和描述
GET 以未加密的形式将数据发送给服务器
HEAD 和GET方法相同,但没有响应体
POST 用于将HTML表单数据发送到服务器,POST方法接收到数据不由服务器缓存
PUT 用上传到内容替换目标资源的所有当前表示
DELETE 删除有URL给出的目标资源的所有当前表示

 

 

 

 

 

 

 

 

三、Flask Request对象

来自客户端网页的数据作为全局请求对象发送到服务器,为了处理请求数据,应该从Flask模块导入。

Request对象的重要属性如下所列:

  • Form - 它是一个字典对象,包含了表单参数及其键值对
  • args - 解析查询字符串的内容,它是问号(?)之后的URL的一部分
  • Cookies - 保存Cookie名称和值的字典对象
  • files - 与上传文件有关的数据
  • method - 当前请求方法

四、Flask将表单数据发送到模板

  当前,可以在URL规则中指定http方法,触发函数接收到Form数据可以从字典对象的形式收集它,并将其转发到模板以在相应的网页上呈现它。

案列:

准备一个提交表单

app.py

from flask import Flask,render_template, request
import os

"""
Flask类的一个对象是我们web服务器网关接口(WSGI)
Flask构造函数使用当前模块(__name__)的名称作为参数
"""


# 获取 template和static的路径
template_folder = os.getcwd() + '/apps/templates'
static_folder = os.getcwd() + '/apps/static'
app = Flask(__name__,template_folder=template_folder, static_folder=static_folder)


@app.route('/')
def student():
   """提交表单""" return render_template('student.html') @app.route('/result',methods = ['POST', 'GET']) def result(): if request.method == 'POST': result = request.form return render_template("result.html", result = result) if __name__ == '__main__': app.run(debug=True)

student.html

<form action="http://localhost:5000/result" method="POST">
     <p>Name <input type = "text" name = "Name" /></p>
     <p>Physics <input type = "text" name = "Physics" /></p>
     <p>Chemistry <input type = "text" name = "chemistry" /></p>
     <p>Maths <input type ="text" name = "Mathematics" /></p>
     <p><input type = "submit" value = "submit" /></p>
</form>

 

result.htm

<!doctype html>
  <table border = 1>
     {% for key, value in result.items() %}
    <tr>
       <th> {{ key }} </th>
       <td> {{ value }}</td>
    </tr>
 {% endfor %}
</table>

flask基本介绍

 

 

 flask基本介绍

 

 

五、Flask Cookie

  Cookie以文本文件的形式存储在客户端的计算机上。其目的是记住和追踪与客户使用相关的数据,以获得更好的访问者体验和网站统计信息。Request对象包含cookie的属性,它是所有cookie变量及其对应值的字典对象,客户端已传输。除此之外,cokkie还存储其网站的到期时间、路径和域名。

  在Flask中,对cookie的处理步骤为:

1、设置cookie

  设置cookie,默认有效期是临时cookie,浏览器关闭就失效;

  可以通过max_age设置有效期,单位是秒

resp = make_response("success").  #设置响应体
resp.set_cookie("w3chool", "w3chool", max_age=3600)

 

2、获取cookie

  获取cookie,通过request.cookies的方式,返回的是一个词典,可以获取字典里的相应的值。

cookie_1 = request.cookies.get("w3school")

3、删除cookie

  这里的删除只是让cookie过期,并不是直接删除cookie。删除cookie,通过delete_cookie()的方式,里面有cookie的名字。

resp = make_response("del success")  # 设置响应体
resp.delete_cookie("w3cshool")

简单实例;

from flask import Flask, make_response, request

apps = Flask(__name__)

@apps.route("/set_cookies")
def set_cookie():
    resp = make_response("suceess")
    resp.set_cookie("w3cshool", "w3cshool", max_age=3600)
    return resp


@apps.route('/get_cookies')
def get_cookie():
    cookie_1 = request.cookies.get("w3cshool")
    return cookie_1

@apps.route('/delete_cookies')
def delete_cookie():
    resp = make_response("del success")
    resp.delete_cookie("w3cshool")
    return resp


if __name__ == "__main__":
    apps.run(debug=True)

 

六、Flask 会话

  与cookie不同,Session(会话)数据存储在服务器上,会话是客户端登录到服务器并注销服务器的时间间隔。需要在该会话中保存到数据会存储在服务器上的临时目录中。为每个客户端会话分配会话ID,会话数据存储在cookie的顶部,服务器以加密方式对其进行签名,对于此加密,Flask应用程序需要一个定义的SECRET_KEY。

  session对象也是一个字典对象,包含会话变量和关联值的键值对。

from flask import Flask, session, redirect, url_for, escape, request


apps = Flask(__name__)
apps.secret_key = "fkdjsafjdkfdlkjfadskjfadskljdsfklj"


@apps.route('/')
def index():
    if 'username' in session:
        username = session['username']
        return '登录用户名是:' + username + '<br>' + \
        "<b><a href = '/logout'>点击这里注销</a></b>"

    return "您暂未登录, <br><a href = '/login'></b>" + \
           "点击这里登录</b></a>"

@apps.route('/login', methods = ['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
   <form action = "" method = "post">
      <p><input type="text" name="username"/></p>
      <p><input type="submit" value ="登录"/></p>
   </form>
   '''

@apps.route('/logout')
def logout():
    # remove the username form the session if it is there
    session.pop('username', None)
    return redirect(url_for('index'))

if __name__ == '__main__':
    apps.run(debug=True)

 

七、Flask重定向和错误

  Flask类有一个redirect()函数,调用时,它返回一个响应对象,并将用户重定向到具有指定状态代码到另一个目标位置。

redirect()函数的原型如下:

Flask.redirect(location, statuscode, response)
  • location 参数是应该重定向响应的URL
  • statuscode 发送到浏览器标头,默认是302
  • response 用于实例化响应

 

八、Flask消息闪现

  Flask提供了一个非常简单的方法来使用闪现系统向用户反馈信息。闪现系统使得在一个请求结束的时候记录一个信息,然后当且在下一个请求中访问这个数据,强调flask闪现是基于flask内置的session的,利用浏览器的session缓存闪现消息,所以必须设置secret_key。

  在Flask web应用应用程序中生成这样的信息很容易。Flask框架的闪现系统可以在一个视图中创建消息,并在名为next的视图函数中呈现它。Flask模块包含flash()方法,它将消息传递给下一个请求,该请求通常是一个模板。

flash(message, category)
  • message 要闪现的实际消息
  • category 是可选的,它可以是'error','info' 或 'warning'

  为了从会话中删除消息,模板调用get_flashed_messages()

get_flashed_messages(with_categories, category_filter)
两个参数都是可选的,如果接收到的消息具有类别,则第一个参数是元组,第二个参数仅用于显示特定消息
{% with messages = get_flashed_messages() %}
   {% if messages %}
      {% for message in messages %}
         {{ message }}
      {% endfor %}
   {% endif %}
{% endwith %}

例:

'/' URL 显示登录页面的链接,没有消息闪现,该链接会将用户引导到'/login' URL,该 URL 显示登录表单。提交时,login() 视图函数验证用户名和密码,并相应闪现 'success' 消息或创建 'error' 变量。

from flask import Flask,request,flash,redirect,url_for,render_template
import os

template_folder = os.getcwd() + '/apps/templates'
static_folder = os.getcwd() + '/apps/static'
apps = Flask(__name__,template_folder=template_folder, static_folder=static_folder)
apps.secret_key = "fkdjsafjdkfdlkjfadskjfadskljdsfklj"

@apps.route('/')
def index():
    return render_template('index.html')


@apps.route('/login', methods = ['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != 'admin' or request.form['password'] != 'admin':
            error = 'Invalid username or password. Please try again!'
        else:
            flash("You were successfully logged in")
            return redirect(url_for('index'))
    return render_template('login.html', error = error)

if __name__ == "__main__":
    apps.run(debug=True)

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <form method = "post" action = "http://localhost:5000/login">
        <table>
            <tr>
                <td>Username</td>
                <td><input type = 'username' name = 'username'></td>
            </tr>
            <tr>
                <td>Password</td>
                <td><input type = 'password' name = 'password'></td>
            </tr>
            <tr>
                <td><input type = "submit" value = "Submit"></td>
            </tr>
        </table>
    </form>
    {% if error %}
        <p><strong>Error</strong>: {{ error }}</p>
    {% endif %}
</body>
</html>

Index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    {% with messages = get_flashed_messages() %}
         {% if messages %}
               {% for message in messages %}
                    <p>{{ message }}</p>
               {% endfor %}
         {% endif %}
    {% endwith %}
<h3>Welcome!</h3>
<a href = "{{ url_for('login') }}">login</a>
</body>
</html>

 

 

 

 

 

 

 

 

 

   

 

上一篇:设计模式与代码的结构特性


下一篇:在线编译安装redis脚本