简介
- django是个大而全的框架,flask是一个轻量级的框架
- django内部为我们提供了非常多的组件:orm/session/cookie/admin/form/modelform/路由/视图/模板/中间件/分页/auth/contenttype/缓存/信号/多数据库连接
- flask框架本身没有太多的功能,路由/视图/模板(jinja2)/session/中间件,第三方组件非常齐全
- django的请求处理是逐一封装和传递:flask的请求是利用上下文管理来实现的
flask快速使用
安装: pip install flask
1.1依赖wsgi Werkzeug
from werkzeug.serving import run_simple
def func(envi,a):
print('请求来了')
pass
if __name__ == '__main__':
run_simple('127.0.0.1',5001,func)
1.2快速使用flask
//app.py
from flask import Flask
#使用Flask类创建一个app对象
#__name __代表当前app.py这个模块
#1.以后出现bug,它可以帮助我们快速定位
#2.对于寻找模板文件,有一个相对路径
app = Flask(__name__)
#创建一个路由和视图函数的映射
@app.route("/")
def hello_world():
return 'hello world'
if __name__=='__main__':
app.run()
用户登录
from flask import Flask, render_template, jsonify, request, redirect
app = Flask(__name__,template_folder="templates")#默认
@app.route('/login',methods=['GET','POST'])
def login():
#return '登录' #HttpResponse
# return jsonify({'code':1000,'data':[1,2,3]})#JsonResponse
if request.method=='GET':
return render_template('login.html') #render
user=request.form.get('user')
pwd=request.form.get('pwd')
if user=='changxin' and pwd=='dsb':
return redirect('/index')
error='用户名或密码错误'
return render_template('login.html',**{'error':error})#或者error=error
@app.route('/index')
def index():
return '首页'
if __name__ == '__main__':
app.run()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户登录</h1>
<form method="post">
<input type="text" name="user">
<input type="text" name="pwd">
<input type="submit" value="提交"><span style="color: red">{
{error}}</span>
</form>
</body>
</html>
项目配置
Debug模式
开启debug模式
我开启后刷新无效?
host配置
主要作用:就是让其他电脑访问我电脑上的flask项目
post
上图中后面添加 --port=8000(注意空格隔开)
url视图
带参数的url
@app.route("/blog/<int:blog_id>")
def blog_detail(blog_id):
return "您访问的博客是:%s" %blog_id
查询字符串的方式传参
/book/List:会给我返回第一页的数据
/book/List?page=2,获取第二页的数据
@app.route('/book/list')
def book_list():
#arguments:参数
#request.args:类字典类型
page=request.args.get("page",default=1,type=int)
return f"您获取的是第{page}的图书列表!"
jinja2模板使用
from flask import Flask,render_template
app = Flask(__name__)
#url:http/https://www.qq.com
@app.route('/')
def hello_world(): # put application's code here
return render_template("index.html")
if __name__ == '__main__':
app.run()
html自动生成标签:书写div然后按tab自动补全
后端传参
@app.route('/blog/<blog_id>')
def blog_detail(blog_id):
return render_template("blog_detail.html",blog_id=blog_id)
blog_detail.html
<h1>{
{blog_id}}</h1>
模板的对象属性
class User:
def __init__(self,username,email):
self.username=username
self.email=email
@app.route('/xiao')
def hello_world():
user=User(username="芬达",email="学霸")
return render_template("index.html",user=user)
{
{ user.username}}
字典引用{
{person["key"]}}或者{
{person.key}}
过滤器的使用
{
{person.key|length}}
自定义过滤器
def datetime_format(value,format="%Y-%m-%d %H:%M" ):
return value.strftime(format)
app.add_template_filter(datetime_format,"dformat")
def filter_demo():
mytime=datetime.now()
return render_template("index.html",mytime=mytime)
{
{mytime|dformat}}
控制语句
@app.route('/xiao')
def hello_world():
age=19
return render_template("index.html",age=age)
@app.route('/xiao')
def hello_world():
age=19
books=[{"name":"小木",
"age":15
},
{"name":"小bing",
"age":18
}]
return render_template("index.html",age=age,books=books)
{% for book in books %}
<div>名字:{
{ book.name}},年龄:{
{ book.age }}</div>
{% endfor %}
模板继承
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是父模板</title>
</head>
<body>
我是父模板的文字
</body>
</html>
child.html
{% extends "base.html" %}
app.py
@app.route('/xiao')
def hello_world():
return render_template("child.html")
{%block%}
base.html
<title>{%block title%}{%endblock%}</title> <body> {%block body%} {%endlock%} </body>
child.html
{% block title%} 我是父模板的标题 {% endblock %} {% block body%} 我是父模板的body {% endblock %}
加载静态文件
<img src="{
{url_for('static',filename='images/ironman.jpg')}}" alt="">
对象关系模型ORM
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text
app = Flask(__name__)
HOSTNAME="127.0.0.1"
PORT=3306
USERNAME="root"
PASSWORD="15175857475a"
DATABASE="xiao"
app.config["SQLALCHEMY_DATABASE_URI"]=f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
#在app.config中设置好链接数据库的信息
#然后使用SQLAlchemy(app)创建一个db对象
#SQLAlchemy会自动读取app.config中链接数据库信息
db=SQLAlchemy(app)
#测试是否链接成功
# with app.app_context():
# with db.engine.connect() as conn:
# rs = conn.execute(text("select 1"))
# print(rs.fetchone())
class User(db.Model):
__tablename__ = "user"
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
username=db.Column(db.String(100),nullable=False)
password=db.Column(db.String(100),nullable=False)
user=User(username="法外",password='11111')
with app.app_context():
db.create_all()
@app.route('/')
def hello_world():
return "hello"
if __name__ == '__main__':
app.run()
数据的增删改查操作
增
@app.route("/user/add")
def add_user():
#1.创建ORM对象
user = User(username="法外", password='11111')
#2.将ORM对象添加到db.session中
db.session.add(user)
#3.将db.session中的改变同步到数据库中
db.session.commit()
return "用户创建成功"
查
@app.route("/user/query")
def query_user():
#1.get查找:根据主键查找
user=User.query.get(1)
print(f"{user.id}:{user.username}{user.password}")
#2.filter_by查找
users=User.query.filter_by(username="法外")
for user in users:
print(user.username)
return "数据查找成功"
改
@app.route("/user/update")
def update_user():
user=User.query.filter_by(username="法外").first()
user.password="2222222"
db.session.commit()
return "数据修改成功"
删
@app.route("/user/delete")
def delete_user():
user=User.query.get(1)
db.session.delete(user)
db.session.commit()
return "数据删除成功"
表关系
class Article(db.Model):
__tablename__="article"
id=db.Column(db.integer,primary_key=True,autoincrement=True)
title=db.Column(db.String(200),nullable=False)
content=db.Column(db.Text,nullable=False)
#添加作者的外键
author_id=db.Column(db.Integer,db.ForeignKey("user.id"))
author=db.relationship("User")
article=Article(title="Flask",content="pig")
文章评论