P01—Flask框架概述(flask与Django的区别)
所提供的组件
Django所提供的组件:
orm/session/cookie/admin/form/modelform/路由/视图/模板/中间件/分页/auth/contenttype/缓存/信号/多数据库连接
Flask所提供的组件:
第三方组件非常齐全,路由/视图/模板/中间件/session
请求处理
Django:
请求处理是逐一封装和处理。(数据一路传递,经过许多的中介,最后传递到我这来)
Flask:
利用上下文管理来实现的。(数据一路传递到某个位置,不会传递到我这来,当我需要的时候再去取出来,这种处理机制称为上下文管理)
P02—今日概要(day1要做的任务)
- flask的快速使用
- 实现一个xx系统
- 蓝图(写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。
- 在app.route()方法中,
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!'
- 导入url_for包,在app.route('/index', endpoint='idx')中,
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>