Flask入门

126 阅读5分钟

P01—Flask框架概述(flask与Django的区别)

所提供的组件

Django所提供的组件:

​ orm/session/cookie/admin/form/modelform/路由/视图/模板/中间件/分页/auth/contenttype/缓存/信号/多数据库连接

Flask所提供的组件:

​ 第三方组件非常齐全,路由/视图/模板/中间件/session

请求处理

Django:

​ 请求处理是逐一封装和处理。(数据一路传递,经过许多的中介,最后传递到我这来)

Flask:

​ 利用上下文管理来实现的。(数据一路传递到某个位置,不会传递到我这来,当我需要的时候再去取出来,这种处理机制称为上下文管理)

P02—今日概要(day1要做的任务)

  1. flask的快速使用
  2. 实现一个xx系统
  3. 蓝图(写flask时的标准的目录结构)

P03—内容回顾(Django的知识回顾,不管)

P04—flask快速上手(安装并编写第一个flask程序)

4.1 安装

pip install flask

4.2 flask所需要的依赖——wsgi Werkzeug(flask一定会调用该依赖)

···

from werkzeug.serving import run_simple

def func(environ, start_response):
    print('请求来了nia!')
    pass

if __name__ == '__main__':
    run_simple('127.0.0.1', 5000, func)  #访问一进来就执行以第三个参数为函数名的函数

···

4.3 快速使用Flask

from flask import Flask

app = Flask(__name__)  # Flask类的实例

@app.route('/index')
def index():
    return 'hello world'

if __name__ == '__main__':
    app.run()

4.4 Flask与wsgi (Flask是基于wsgi实现的)

from werkzeug.serving import run_simple

class Flask(object):
    
	def __call__(self,environ,start_response):
        return 'xx'   #此处应该写的就是flask源码内容
    
    def run(self):
        run_simple('127.0.0.1', 5000, self)   #若第三个参数为对象,则执行对象中的__call__方法
        
app = Flask()

if __name__ == '__main__':
    app.run()

4.5 总结

  • flask框架是基于werkzeug的wsgi实现的,flask自己没有wsgi。
  • 用户请求一旦到来,就会调用app.__call__方法。

P5 用户登录示例()

  • render_template:render_template 是 Flask 框架提供的一个方法,用于渲染模板文件并生成 HTML 响应。
  • 所有新建的html文件都应该放在一个新建的template文件目录下,html文件默认放在名为template文件夹下,要想修改文件夹名字,需要在创建Flask对象时修改参数template_folder(template_folder = gouba,就可以将html文件放在gouba目录下 )
  • render_template类似于Django中的HttpResponse
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/login')
def login():  
    return render_template('login.html')   

if __name__ == '__main__':
    app.run()
  • 登录实例代码
    • 在app.route()方法中,methods 参数用于指定可以接受的 HTTP 请求方法。
    • request.method用于判断发过来的请求类型
    • request.form.get()用于获取post请求中的参数
    • redirect 方法用于重定向用户的请求。当用户访问某个路由时,可以使用 redirect 方法将其重定向到另一个路由或 URL。
from flask import Flask, render_template,request,redirect

app = Flask(__name__)

@app.route('/login', methods = ['GET', 'POST'])   #让login方法既可以接受get,也可以接受post方法
def login():  #默认情况该函数只能接受get请求
    #get
    if request.method == 'GET':  #判断是否为get请求
        return render_template('login.html')

    #post   通过request.form来接收请求体传过来的值(用户数据)
    user = request.form.get('user')
    pwd = request.form.get('pwd')
    error = '用户名或密码错误'
    if user == 'shuhao' and pwd == "shu123456":
        return redirect('/index')  #跳转路径
    
    return render_template('login.html', error = error)  #将error数据传到前端

@app.route('/index')
def index():
    return '首页'


if __name__ == '__main__':
    app.run()

P6 用户编辑实例

6.1 Jinja2前置知识

  • Jinja2 是一个流行的 Python 模板引擎, 通常用于将动态数据插入到静态模板中,以生成动态的网页内容。
  • 在 Jinja2 中,{% %} 用于包含控制结构,如循环、条件语句等
  • {{ }} 则用于包含表达式,用于显示变量值或执行函数。
  • .items() 方法可以用于遍历字典中的每个键值对

6.2 用户编辑实例代码

  • 两种post传参方法 (nid == key)

    @app.route('/edit') #接收参数方式1 "/edit?nid={{key}}" <!--传参方式1-->

    @app.route('/del/<int:nid>') #接收参数方式2 "/del/{{key}}" <!--传参方式2-->

  • url_for

    • 导入url_for包,在app.route('/index', endpoint='idx')中, endpoint 参数用于指定该路由的名称,即路由的终点。为路由指定一个唯一的标识符,以便在应用程序中引用该路由;使用 url_for() 函数生成 URL 。例如,在下面的代码中,'/index'是路由的路径,’idx‘是该路由的终点名称。当需要在应用程序中生成指向该路由的 URL 时,可以使用 url_for('idx') 来引用它,这将生成指向 '/index' 路由的 URL。url = url_for('idx') print(url) 会输出'/index'
    • @app.route('/index', endpoint='idx') def index(): return 'Hello, World!'
from flask import Flask, render_template, request ,redirect, url_for

app = Flask(__name__)

#数据
DATA_DICT = {
    1: {'name':'shuhao', "age":73},
    2: {'name':'yuliang', "age":84},
}

# login登录
@app.route('/login', methods = ['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')

    user = request.form.get('user')
    pwd = request.form.get('pwd')
    error = '账号或密码错误请重新输入'

    if user == 'shuhao' and pwd == '123456':
        return redirect('/index')    #登录成功跳转到index页面

    return render_template('login.html', error = error)

# index首页
@app.route('/index',endpoint='idx')
def index():
    data_dict = DATA_DICT
    return render_template('index.html', data_dict = data_dict)   #从templates中找到html页面

# edit用户编辑
@app.route('/edit') #接收参数方式1
def edit():
    nid = request.args.get('nid')
    print(nid)
    return '修改'

# delete用户删除
@app.route('/del/<int:nid>')  #接收参数方式2
def delete(nid):
    del DATA_DICT[nid]
    return redirect(url_for('idx'))

if __name__ == '__main__':
    app.run()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h1>用户列表</h1>
    <table border="1">
        <thead>  <!--定义表格的头部 -->
            <tr> <!--表格行标签-->
                <th>ID</th>  <!-- 设置表格列标题 -->
                <th>用户名</th>
                <th>年龄</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>  <!-- 定义表格的主体部分 -->
            {% for key, value in data_dict.items() %}  <!--  Jinja2 模板引擎中的语法。-->
                <tr>
                    <td>{{key}}</td>
                    <td>{{value.name}}</td>
                    <td>{{value.age}}</td>
                    <td>
                        <a href="/edit?nid={{key}}">编辑</a> <!--传参方式1-->
                        <a href="/del/{{key}}">删除</a>  <!--传参方式2-->
                    </td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" name="提交"><span style="color:red">{{error}}</span>
    </form>
</body>
</html>