zoukankan      html  css  js  c++  java
  • Flask学习笔记(基础)

    Flask运行原理(源码解读)

    https://blog.csdn.net/sinat_36651044/article/details/77532510

    1、最简单的开始

    |-fflask
        |-static
        |-templates
        |-app.py
     1 from flask import Flask
     2 
     3 app = Flask(__name__)
     4 
     5 
     6 @app.route('/')
     7 def hello_world():
     8     return 'Hello World!'
     9 
    10 
    11 if __name__ == '__main__':
    12     app.run()
    app.py

    2、Jinja2模板、自定义错误页面、静态文件

     1 from flask import Flask,render_template
     2 
     3 app = Flask(__name__)
     4 
     5 @app.route('/')
     6 def index():
     7     return render_template('index.html')
     8 
     9 @app.route('/user/<name>')
    10 def user(name):
    11     return render_template('user.html',name=name)
    12 
    13 @app.route('/hello_world')
    14 def hello_world():
    15     return 'Hello World!'
    16 
    17 @app.errorhandler(404)
    18 def page_not_found(e):
    19     return render_template('404.html'),404
    20 
    21 @app.errorhandler(500)
    22 def errorhandler(e):
    23     return render_template('500.html'),500
    24 
    25 if __name__ == '__main__':
    26     app.run()
    app.py
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     {% block head %}
     6     <title>----{% block title %}{% endblock %}----</title>
     7     {% endblock %}
     8 </head>
     9 <body>
    10 <p>Flask的Base页面</p>
    11     {% block body %}
    12     {% endblock %}
    13 </body>
    14 </html>
    base.html 
    1 {% extends 'base.html' %}
    2 <!--head在基模板中不是空的,使用super()获取原本内容-->
    3 {% block head %}{{ super() }}{% endblock %}
    4 {% block title %}首页{% endblock %}
    5 {% block body %}首页的body{% endblock %}
    index.html
    1 {% extends 'base.html' %}
    2 {% block head %}{{ super() }}{% endblock %}
    3 {% block title %}用户--{{ name }}{% endblock %}
    4 {% block body %}{% endblock %}
    user.html
    1 {% extends 'base.html' %}
    2 {% block head %}{{ super() }}{% endblock %}
    3 {% block title %}404{% endblock %}
    4 {% block body %}
    5     <image src="{{ url_for('static',filename='images/404.jpg') }}"></image>
    6 {% endblock %}
    404.html
    1 {% extends 'base.html' %}
    2 {% block head %}{{ super() }}{% endblock %}
    3 {% block title %}500{% endblock %}
    4 {% block body %}<h1>500</h1>{% endblock %}
    500.html

    3、Web表单 | Flask-WTF

    3.1 基础使用,form的创建和验证

     1 from flask import Flask,render_template
     2 from flask_wtf import FlaskForm
     3 from wtforms import StringField,SubmitField
     4 from wtforms.validators import DataRequired,IPAddress
     5 
     6 app = Flask(__name__)
     7 app.config['SECRET_KEY'] = 'key1'
     8 
     9 class NameForm(FlaskForm):
    10     name = StringField('你叫啥:',validators=[DataRequired()])
    11     ip = StringField('IP地址:',validators=[IPAddress()])
    12     submit = SubmitField('提交;-)')
    13 
    14 
    15 @app.route('/',methods=['GET','POST'])
    16 def index():
    17     name = ''
    18     ip = ''
    19     form = NameForm()
    20     print(name,ip)
    21     if form.validate_on_submit():
    22         name = form.name.data
    23         ip = form.ip.data
    24         form.name.data=''
    25         form.ip.data=''
    26     return render_template('index.html',form=form,name=name,ip=ip)
    27 
    28 @app.route('/user/<name>')
    29 def user(name):
    30     return render_template('user.html',name=name)
    31 
    32 @app.route('/hello_world')
    33 def hello_world():
    34     return 'Hello World!'
    35 
    36 @app.errorhandler(404)
    37 def page_not_found(e):
    38     return render_template('404.html'),404
    39 
    40 @app.errorhandler(500)
    41 def errorhandler(e):
    42     return render_template('500.html'),500
    43 
    44 if __name__ == '__main__':
    45     app.run()
    app.py
     1 {% extends 'base.html' %}
     2 <!--head在基模板中不是空的,使用super()获取原本内容-->
     3 {% block head %}{{ super() }}{% endblock %}
     4 {% block title %}首页{% endblock %}
     5 {% block body %}
     6     <p>首页的body</p>
     7     <div>
     8     Hello!{{ name }}---{{ ip }}
     9     </div>
    10     <div>
    11     <form method="post" action="">
    12         {{ form.hidden_tag() }}
    13         {{ form.name.label }}{{ form.name() }}<br>
    14         {{ form.ip.label }}{{ form.ip() }}<br>
    15         {{ form.submit() }}
    16     </form>
    17     </div>
    18 {% endblock %}
    index.html

    3.2 Post/重定向/Get模式,用户会话存储数据

     改善用户体验,在post提交后刷新页面不再弹框警告

     全局变量session,将数据保存在客户端cookie中

     1 from flask import Flask,render_template,session,redirect,url_for
     2 from flask_wtf import FlaskForm
     3 from wtforms import StringField,SubmitField
     4 from wtforms.validators import DataRequired,IPAddress
     5 
     6 app = Flask(__name__)
     7 app.config['SECRET_KEY'] = 'key1'
     8 
     9 class NameForm(FlaskForm):
    10     name = StringField('你叫啥:',validators=[DataRequired()])
    11     ip = StringField('IP地址:',validators=[IPAddress()])
    12     submit = SubmitField('提交;-)')
    13 
    14 
    15 @app.route('/',methods=['GET','POST'])
    16 def index():
    17     form = NameForm()
    18     if form.validate_on_submit():
    19         session['name'] = form.name.data
    20         session['ip'] = form.ip.data
    21         return redirect(url_for('index'))
    22     return render_template('index.html',form=form,name=session.get('name'),ip=session.get('ip'))
    23 
    24 @app.route('/user/<name>')
    25 def user(name):
    26     return render_template('user.html',name=name)
    27 
    28 @app.route('/hello_world')
    29 def hello_world():
    30     return 'Hello World!'
    31 
    32 @app.errorhandler(404)
    33 def page_not_found(e):
    34     return render_template('404.html'),404
    35 
    36 @app.errorhandler(500)
    37 def errorhandler(e):
    38     return render_template('500.html'),500
    39 
    40 if __name__ == '__main__':
    41     app.run()
    app.py(改动index函数)

    3.3 Flash消息

    从后端闪现消息给前端

     1 from flask import Flask,render_template,session,redirect,url_for,flash
     2 from flask_wtf import FlaskForm
     3 from wtforms import StringField,SubmitField
     4 from wtforms.validators import DataRequired,IPAddress
     5 
     6 app = Flask(__name__)
     7 app.config['SECRET_KEY'] = 'key1'
     8 
     9 class NameForm(FlaskForm):
    10     name = StringField('你叫啥:',validators=[DataRequired()])
    11     ip = StringField('IP地址:',validators=[IPAddress()])
    12     submit = SubmitField('提交;-)')
    13 
    14 
    15 @app.route('/',methods=['GET','POST'])
    16 def index():
    17     form = NameForm()
    18     if form.validate_on_submit():
    19         old_name = session.get('name')
    20         if old_name!=None and old_name!=form.name.data:
    21             flash('小伙子,看来你改名了!')
    22         session['name'] = form.name.data
    23         session['ip'] = form.ip.data
    24         return redirect(url_for('index'))
    25     return render_template('index.html',form=form,name=session.get('name'),ip=session.get('ip'))
    26 
    27 @app.route('/user/<name>')
    28 def user(name):
    29     return render_template('user.html',name=name)
    30 
    31 @app.route('/hello_world')
    32 def hello_world():
    33     return 'Hello World!'
    34 
    35 @app.errorhandler(404)
    36 def page_not_found(e):
    37     return render_template('404.html'),404
    38 
    39 @app.errorhandler(500)
    40 def errorhandler(e):
    41     return render_template('500.html'),500
    42 
    43 if __name__ == '__main__':
    44     app.run()
    app.py(改动index函数)
     1 {% extends 'base.html' %}
     2 <!--head在基模板中不是空的,使用super()获取原本内容-->
     3 {% block head %}{{ super() }}{% endblock %}
     4 {% block title %}首页{% endblock %}
     5 {% block body %}
     6     <p>首页的body</p>
     7     <div>
     8     Hello!{{ name }}---{{ ip }}
     9     </div>
    10     <div>
    11     <!--获取后台flash过来的内容-->
    12     {% for message in get_flashed_messages() %}
    13         {{ message }}
    14         {% endfor %}
    15     <form method="post" action="">
    16         {{ form.hidden_tag() }}
    17         {{ form.name.label }}{{ form.name() }}<br>
    18         {{ form.ip.label }}{{ form.ip() }}<br>
    19         {{ form.submit() }}
    20     </form>
    21     </div>
    22 {% endblock %}
    index.html

    4、数据库,ORM,Flask-SQLAlchemy

     1 from flask import Flask,render_template,session,redirect,url_for,flash
     2 from flask_wtf import FlaskForm
     3 from wtforms import StringField,SubmitField
     4 from wtforms.validators import DataRequired,IPAddress
     5 from flask_sqlalchemy import SQLAlchemy
     6 
     7 app = Flask(__name__)
     8 app.config['SECRET_KEY'] = 'key1'
     9 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1/world?charset=utf8'
    10 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    11 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    12 db = SQLAlchemy(app)
    13 
    14 class NameForm(FlaskForm):
    15     name = StringField('你叫啥:',validators=[DataRequired()])
    16     ip = StringField('IP地址:',validators=[IPAddress()])
    17     submit = SubmitField('提交;-)')
    18 
    19 class Role(db.Model):
    20     __tablename__ = 'roles'
    21     id = db.Column(db.Integer,primary_key=True)
    22     name = db.Column(db.String(64),unique=True)
    23     users = db.relationship('User',backref='role')
    24     def __repr__(self):
    25         return '<Role %r>'%self.name
    26 
    27 class User(db.Model):
    28     __tablename__ = 'users'
    29     id = db.Column(db.Integer,primary_key=True)
    30     username = db.Column(db.String(64),unique=True,index=True)
    31     role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
    32     def __repr__(self):
    33         return '<Role %r>'%self.username
    34 
    35 
    36 
    37 
    38 @app.route('/',methods=['GET','POST'])
    39 def index():
    40     form = NameForm()
    41     if form.validate_on_submit():
    42         user = User.query.filter_by(username=form.name.data).first()
    43         if user is None:
    44             user = User(username=form.name.data)
    45             db.session.add(user)
    46             session['known'] = False
    47         else:
    48             session['known'] = True
    49         session['name'] = form.name.data
    50         form.name.data=''
    51         return redirect(url_for('index'))
    52     return render_template('index.html',form=form,name=session.get('name'),ip=session.get('ip'))
    53 
    54 @app.route('/user/<name>')
    55 def user(name):
    56     return render_template('user.html',name=name)
    57 
    58 @app.route('/hello_world')
    59 def hello_world():
    60     return 'Hello World!'
    61 
    62 @app.errorhandler(404)
    63 def page_not_found(e):
    64     return render_template('404.html'),404
    65 
    66 @app.errorhandler(500)
    67 def errorhandler(e):
    68     return render_template('500.html'),500
    69 
    70 if __name__ == '__main__':
    71     app.run()
    app.py
     1 {% extends 'base.html' %}
     2 <!--head在基模板中不是空的,使用super()获取原本内容-->
     3 {% block head %}{{ super() }}{% endblock %}
     4 {% block title %}首页{% endblock %}
     5 {% block body %}
     6     <p>首页的body</p>
     7     <div>
     8     Hello!{{ name }}---{{ ip }}
     9     </div>
    10     <div>
    11     <h1>hello,{% if name %}{{ name }}{% else %}陌生人{% endif %}</h1>
    12     {% if not know %}
    13         <p>很高兴认识你</p>
    14     {% else %}
    15         <p>很高兴再见到你</p>
    16     {% endif %}
    17     <form method="post" action="">
    18         {{ form.hidden_tag() }}
    19         {{ form.name.label }}{{ form.name() }}<br>
    20         {{ form.ip.label }}{{ form.ip() }}<br>
    21         {{ form.submit() }}
    22     </form>
    23     </div>
    24 {% endblock %}
    index.html
     1 #配置数据库连接
     2 app = Flask(__name__)
     3 app.config['SECRET_KEY'] = 'key1'
     4 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1/world?charset=utf8'
     5 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
     6 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
     7 db = SQLAlchemy(app)
     8 
     9 #定义模型
    10 class NameForm(FlaskForm):
    11     name = StringField('你叫啥:',validators=[DataRequired()])
    12     ip = StringField('IP地址:',validators=[IPAddress()])
    13     submit = SubmitField('提交;-)')
    14 
    15 class Role(db.Model):
    16     __tablename__ = 'roles'
    17     id = db.Column(db.Integer,primary_key=True)
    18     name = db.Column(db.String(64),unique=True)
    19     users = db.relationship('User',backref='role')
    20     def __repr__(self):
    21         return '<Role %r>'%self.name
    22 
    23 #创建删除表,可以在flask shell中操作
    24 db.create_all()
    25 db.drop_all()
    26 
    27 #
    28 admin_role = Role(name='Admin')
    29 user1 = User(username='Jim',role=admin_role)
    30 db.session.add(admin_role)
    31 db.session.add(user1)
    32 db.session.commit()
    33 
    34 #
    35 #查全部,返回列表
    36 Role.query.all() 
    37 #查单个,返回query对象
    38 admin_role = Role.query.filter_by(name='Admin').first()
    39 
    40 #
    41 db.session.delete(admin_role)
    42 db.session.commit()
    43 
    44 #
    45 admin_role.name = 'AD'
    46 db.session.add(admin_role)
    47 db.session.commit()
    48 
    49 #回滚,在commit前都可以回滚到上次commit时的状态
    50 db.seesion.rollback()
    建增删改查

     查看sql语句

     str(Role.query.filter_by(name='Admin').first())

  • 相关阅读:
    滚动条美化插件 nicescroll
    百度地图api
    Echarts的重点
    3月20号课堂随笔
    循环for语句
    有关一些CSS的基本内容
    HTML基本标签和一些注释的问题
    2018年3月17号的随堂笔记
    03.15补习
    for 的相关用法
  • 原文地址:https://www.cnblogs.com/cx59244405/p/9745114.html
Copyright © 2011-2022 走看看