python web框架
同步框架:
异步框架: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需要导入:
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文件名称")