ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

flask基本介绍

2021-09-18 12:33:38  阅读:137  来源: 互联网

标签:基本 __ flask request apps 介绍 Flask cookie template


一、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 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>

 

 

 

 

 

 

 

 

 

   

 

标签:基本,__,flask,request,apps,介绍,Flask,cookie,template
来源: https://www.cnblogs.com/hllearner/p/15308208.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有