目录
Flask介绍和安装
python web框架
同步框架:
- Django:大而全(3.x以后支持异步)
- flask:小而精,插件的支持
异步框架:Sanic、FastAPI
flask介绍
Flask是一个基于Python开发并且依赖jinja2模板(DTL)和Werkzeug WSGI(符合wsgi协议的web服务器,wsgiref)服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
flask安装
pip install flask
简单使用
from flask import Flask
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return 'hello world'
if __name__ == '__main__':
# 运行
app.run()
访问:
http://127.0.0.1:5000/
请求与session与返回值
请求和session需要导入:
from flask import Flask, request, session
属性 | 含义 |
---|---|
request.method | 请求方法,’GET’、’POST’ |
request.form | post请求携带的参数,request.form.get(”) |
session | 写入cookie,使用session,session[”] = ” |
返回字符串
类比django中HttpResponse(‘字符串’)
from flask import Flask
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return '字符串'
if __name__ == '__main__':
# 运行
app.run()
返回模板(网页)
类比django中Render(request,模板,{})
from flask import Flask, render_template
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return render_template(模板, 参数1=?, 参数2=?)
if __name__ == '__main__':
# 运行
app.run()
返回重定向
类比django中Redirect(‘路由’)
from flask import Flask, redirect
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return redirect('路由')
if __name__ == '__main__':
# 运行
app.run()
返回json
类比django中JsonResponse
from flask import Flask, jsonify
# 名字随意
app = Flask('main')
# 路由
@app.route('/')
def index():
return jsonify(字典或列表..)
if __name__ == '__main__':
# 运行
app.run()
登录案例
功能:登录成功cookie保存,没有登录时无法访问特定页面。
目录结构:
项目名
├── templates -- 网页文件夹,必须叫templates
├ ├── detail.html -- 单用户详情页
├ ├── index.html -- 用户列表
├ └── login.html -- 登录页面
└── login.py -- 功能实现
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<table>
{% for k,v in user_dict.items() %}
<tr>
<td>{{ k }}</td>
<td>{{ v.name }}</td>
<td>{{ v['name']}}</td>
<td>{{ v.get('name')}}</td>
<td><a href="/detail/{{ k }}">查看详细</a></td>
</tr>
{% endfor %}
</table>
</body>
</html>
detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>详细信息 {{ info.name }}</h1>
<div>
{{ info.text }}
</div>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
用户名<input type="text" name="username">
密码<input type="password" name="password">
<input type="submit" value="登录">
<p>{{ error }}</p>
</form>
</body>
</html>
login.py
from flask import Flask, render_template, redirect, jsonify, request, session
from functools import wraps
app = Flask('main')
app.secret_key = 'abcdd' # 如果要使用session,必须写秘钥
# 用户信息,暂时用全局变量存储
USERS = {
1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}
# 登录装饰器,判断是否登录
def login_decorator(func):
@wraps(func) # 装饰器修复技术
def inner(*args, **kwargs):
username = session.get('username')
if username:
return func(*args, **kwargs)
else:
# 没有登录返回登录页面
return redirect('/login')
return inner
@app.route('/')
@login_decorator
def index():
return render_template('index.html', user_dict=USERS)
@app.route('/detail/<int:pk>')
@login_decorator
def detail(pk):
return render_template('detail.html', info=USERS.get(pk))
# 只接受get和post请求
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
# 判断是否登录成功
if username == 'tom' and password == '123':
# cookie保存
session['username'] = 'tom'
# 成功跳转到http://127.0.0.1:5000/
return redirect('/')
else:
# 登录失败给页面传参显示错误信息
return render_template('login.html', error='用户名或密码错误')
if __name__ == '__main__':
# 运行
app.run()
配置文件写法
第一种:
app.secret_key='asfasdf'
app.debug=True
第二种:app所有的配置项都在app.config这个字典中
app.config['DEBUG']=True
第三种:仿django的settings.py 写法(导入)
app.config.from_pyfile('settings.py')
# settings.py
DEBUG=False
NAME='lqz'
第四种:通过类的方式(导入)
app.config.from_object('settings.DevelopmentConfig')
class Config(object):
DEBUG = False
DATABASE_URI = 'sqlite://:memory:'
class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo'
class DevelopmentConfig(Config):
DEBUG = True
其他
app.config.from_envvar("环境变量名称")
app.config.from_json("json文件名称")
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/279141.html