文章目录
一、Flask与Django对比
1.Django
- 相当于一个毛坯房,装饰装饰就很美,局限性大
- Django功能大而全
- Django有模板,表单,路由,认证,基本的数据库管理等等内建功能。
2.Flask
- 相当于有盖房的材料,需要自己盖和装修,局限性小
- Flask只包含基本的配置 Django的一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。
- Flask只是一个内核,默认依赖于两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集,其他很多功能都是以扩展的形式进行嵌入使用。
- Flask 比 Django 更灵活 用Flask来构建应用之前,选择组件的时候会给开发者带来更多的灵活性 ,可能有的应用场景不适合使用一个标准的ORM(Object-Relational Mapping 对象关联映射),或者需要与不同的工作流和模板系统交互。
二、flask的简单使用
1.flask的安装
pip install flask
2.flask写的第一个程序:hello world
from flask import Flask
app = Flask(__name__) # 实例化app实例
@app.route('/index') # 路由
def index(): # 视图
return 'hello world' # 返回值,类似Django的HTTPResponse
if __name__ == '__main__':
# app.run()#项目启动,默认5000端口,可以自己修改
点击运行:
三、写一个简单的登录页面
1.按照Django的逻辑,应该创建一个templates存放模板文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form method="post">
账户:<input type="text" name="user">
密码:<input type="password" name="pwd">
<input type="submit" value="提交">
</form>
</body>
</html>
2.然后写我们的flask_login.py文件,按照Django逻辑返回模板应该有专门的render
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/login')
def login():
return render_template('login.html')
if __name__ == '__main__':
app.run(debug=True) # debug=true,表示可以边运行边调试
3.按照Django的逻辑,我们模板应该有个配置文件,点击Flask的源码,因此需要配置
app = Flask(__name__,template_folder='templates')
4.由于我们默认支持get请求,但是我们登陆注册一般是post请求,因此还需要配置
@app.route('/login',methods=['GET',"POST"])
5.测试修改后的代码
from flask import Flask,render_template
app = Flask(__name__,template_folder='templates')
@app.route('/login',methods=['GET',"POST"])
def login():
return render_template('login.html')
if __name__ == '__main__':
app.run(debug=True) # debug=true,表示可以边运行边调试
扫描二维码关注公众号,回复:
13170929 查看本文章
6.接下来获取我们提交的数据,即账号和密码,按照Django的逻辑应该从request里边获取get或者post的数据,因此修改代码
from flask import Flask,render_template,request
app = Flask(__name__, template_folder='templates')
@app.route('/login', methods=['GET', "POST"])
def login():
# request.form获取post的值,request.args获取get的值
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == 'zs' and pwd == '123':
print('登录成功')
return render_template('login.html')
if __name__ == '__main__':
app.run(debug=True) # debug=true,表示可以边运行边调试
7.按照Django的经验,当我们登陆失败一般传入一个错误信息到前端展示
login.html 核心代码
<form method="post">
账户:<input type="text" name="user">
密码:<input type="password" name="pwd">
<input type="submit" value="提交">{
{msg}}
</form>
-----------------------------------------------------------
flask_login.py 核心代码
@app.route('/login', methods=['GET', "POST"])
def login():
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == 'zs' and pwd == '123':
print('登录成功')
else:
return render_template('login.html',msg='账户或者密码错误!')
return render_template('login.html')
此时输错账号密码或者不输信息提交,会变成
8.按照Django的逻辑,当登陆成功会进行重定向到其他页面
from flask import Flask, render_template, request, redirect
app = Flask(__name__, template_folder='templates')
@app.route('/login', methods=['GET', "POST"])
def login():
# request.form获取post的值,request.args获取get的值
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == 'zs' and pwd == '123':
return redirect('/index')
else:
return render_template('login.html', msg='账户或者密码错误!')
return render_template('login.html')
@app.route('/index')
def index():
return '欢迎登录!'
if __name__ == '__main__':
app.run(debug=True) # debug=true,表示可以边运行边调试
9.我们如果不登录也能访问index,不安全,因此按照Django需要加入session
from flask import session
if user == 'zs' and pwd == '123':
session['user']=user
return redirect('/index')
运行,输入正确账号和密码,发现报错
因为此时session存入cookie,不安全,需要加密session才可以存入,因此需要配置
from flask import session
app = Flask(__name__, template_folder='templates')
app.secret_key='wewfsdassaf' # 随便写
配置完后,需要在登录进去的页面进行判断,判断是否有session
@app.route('/index')
def index():
# 因为session是个特殊的字典,因此可以使用get方法
if session.get('user'):
return '欢迎登录!'
return redirect('/login')
10.有登录就会有注销
@app.route('/logout')
def logout():
del session['user']
return redirect('/login')
11.完整代码
from flask import Flask, render_template, request, redirect, session
app = Flask(__name__, template_folder='templates')
app.secret_key='wewfsdassaf' # 随便写
@app.route('/login', methods=['GET', "POST"])
def login():
# request.form获取post的值,request.args获取get的值
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == 'zs' and pwd == '123':
session['user'] = user
return redirect('/index')
else:
return render_template('login.html', msg='账户或者密码错误!')
return render_template('login.html')
@app.route('/index')
def index():
# 因为session是个特殊的字典,因此可以使用get方法
if session.get('user'):
return '欢迎登录!'
return redirect('/login')
@app.route('/logout')
def logout():
del session['user']
return redirect('/login')
if __name__ == '__main__':
app.run(debug=True) # debug=true,表示可以边运行边调试
12.使用钩子来判断访问其他页面时候是否登录
from flask import Flask, request, render_template, redirect, session, jsonify
import uuid
import queue
app = Flask(__name__,template_folder='templates')
app.secret_key = 'asdfasdf'
# 在用户访问之前判断是否登录,每次请求时候都会进行判断
@app.before_request
def check_login():
# 如果用户访问login则直接让访问
if request.path == '/login':
return None
user = session.get('user_info')
if not user:
return redirect('/login')
@app.route('/login', methods=['GET', "POST"])
def login():
if request.method == "GET":
return render_template('login.html')
else:
user = request.form.get('user')
pwd = request.form.get('pwd')
uid = str(uuid.uuid4()) # 生成一个uuid
# 把用户登录信息放入到session 中去
session['user_info'] = {
'uid': uid, 'name': user}
return redirect('/index')
四、写一个简单的查看个人信息
1.在刚才代码的基础上,我们要设计一个登录进去可以查看个人信息的功能,首先在代码中添加一个全局的假数据个人信息
from flask import Flask, render_template, request, redirect, session
app = Flask(__name__, template_folder='templates')
app.secret_key = 'wewfsdassaf' # 随便写
# 用户数据
USER_DICT = {
'1': {
'name': '张三', 'age': 18},
'2': {
'name': '李四', 'age': 21},
'3': {
'name': '王五', 'age': 9},
}
2.修改flask_login.py,想在登录成功的页面展示该数据,需要创建模板
@app.route('/index')
def index():
# 因为session是个特殊的字典,因此可以使用get方法
if session.get('user'):
return render_template('index.html', user_dict=USER_DICT)
return redirect('/login')
index.html,flsak的语法和python原始语法相同
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<ul>
{% for k,v in user_dict.items() %}
<li>{
{v.name}}<a href="/detail?uid={
{k}}">查看详细</a></li>
{% endfor %}
</ul>
</body>
</html>
运行,登录成功后
3.创建查看详细的页面
@app.route('/detail')
def detail():
# 因为session是个特殊的字典,因此可以使用get方法
if not session.get('user'):
return redirect('/login')
uid = request.args.get('uid') # 获取url传入的uid
info = USER_DICT.get(uid)
return render_template('detail.html', info=info)
detail.html主要代码
<h1>查看{
{info.name}}的个人信息</h1>
姓名:{
{info.name}}<br>
年龄:{
{info.age}}
4.运行