美文网首页
Python_Flask 基础2

Python_Flask 基础2

作者: Fizz翊 | 来源:发表于2018-10-09 22:27 被阅读1次

    1模版语法

    1.1 模版语法主要分为两种: 变量和标签

    模版中的变量 : {{ var }}

    模版中的标签:{% tag %}

    1.2结构标签

    Block 挖坑

    {% block xxx %}
    
    {% endblock %}
    

    extends 继承

    {% extends 'xxx.html' %}
    
    继承后保留块中的内容
    {{ super() }}
    

    macro 宏(函数)

    {% macro hello(name) %}
        {{ name }}
    {% endmacro %}
    宏定义 可以在模版中定义函数,在其他地方调用
    

    导入宏

    {% from 'xxx.html' import xxx %}
    

    1.3循环

    {% for item in cols %}
        aa
    {% else %}
        bb
    {% endfor %}
    

    也可以获取循环消息的loop

    loop.first
    loop.last
    loop.index 当前迭代的次数 从1开始
    loop.revindex 到循环结束需要迭代的次数 从1开始
    

    1.4过滤器

    语法:

    {{ 变量|过滤器|过滤器 }}
    

    capitalize 首字母大写

    lower 小写

    upper 大写

    safe 将样式渲染到页面中

    2. 静态文件信息配置

    第一种方式:

    <link  rel="stylesheet" href="/static/css/main.css">
    

    第二种方式:

    <link rel="stylesheet" href = "{{ url_for('static',filename='css/main.css') }}">
    

    3.数据库的链接

    3.1 安装

    pip install flask-sqlalchemy
    pip install pymysql
    

    3.2定义模型

    使用SQLALchemy的对象去创建字段

    _tablename_ 指定创建的数据库的名称

    创建models.py文件

    from flask_sqlalchemy import SQLALchemy
    
    db = SQLALchemy()
    
    class Student(db.Model):
        id = db.Column(db.Integer,primary_key = True,autoincrement=True)
        s_name = db.Column(db.String(16),unique=True)
        s_age = db.Column(db.Integer,default=1)
        
        __tablename__ = 'student'
    

    Integer 表示创建的字段类型为整形

    Primary_key 表示为主键

    String 表示为字符串

    Unique 表示唯一

    autoincrement 表示自增

    3.3 创建表

    在views.py中引入db

    from app.models import db
    
    @blue.route('/create_db/')
    def create_db():
        db.create_all()
        return '删除成功'
        
    @blue.route('/drop_db/')
    def drop_db():
        db.drop_all()
        return '删除成功'
    

    db.create_all() 表示创建定义模型中对应到数据库中的表

    db.drop_all() 表示删除数据库中的所有的表

    3.4初始化SQLALchemy

    在文件的根目录下flask.py文件中使用SQLALchemy去整合一个或者多个Flask应用

    方法一:

    from app.models import db
    
    db.init_app(app)
    

    方法二:

    from APP.models import db
    
    def create_app():
        app = Flask(__name__)
        db.init_app(app)
        return app
    

    3.5配置数据库的访问地址

    在根目录下的flask1.py文件中如下配置:

    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@localhost:3306/HelloFlask"
    

    HelloFlask 为数据库名称

    3.6对学生数据进行CRUD操作

    语法: 类名.query.xxx

    获取查询集:all() filter(类名.属性名==xxx) filter_by(属性名=xxx)

    3.6.1添加数据
    def create_stu():
        stu = Student()
        stu.s_name = '小红'
        stu.s_age = 20
        
        db.session.add()
        db.session.commit()
        
        return '添加成功'
    
    3.6.2 获取全部学生信息
    def get_stu():
        students = Students.query.all()
        return render_template('xx.html',students=students)
    
    3.6.3 获取某个学生的信息

    写法1:

    the_stu = Students.query.filter(Students.s_name=='小花')
    

    写法2:

    the_stu = Student.query.filter_by(s_name='小花')
    

    写法3:

    sql  = 'select * from student where s_name=小花 '
    student =db.session.execute(sql)
    
    3.6.4 修改学生信息

    写法1:

    students = Student.query.filter_by(s_id=3).first()
    students.s_name = '小黑'
    db.session.commit()
    

    写法2:

    Student.query.filter_by(s_id=3).update({'s_name':'小黑'})
    db.session.commit()
    
    3.6.5删除某个学生的信息
    stu = Students.query.filter_by(s_id=2).first()
    db.session.delete(stu)
    db.session.commit()
    

    Ps: 在数据库的增删改中,如果不在最后 db.session.commit() 则数据库中的数据不会更新,只会更新本地缓存的数据。

    4.flask中的密码加密

    方法1 使用Werkzeug

    Werkzeug中的security模块可以很方便的实现哈希值的计算,只需要两个函数,分别用于用户注册和用户验证阶段

    generate_password_hash(password,method=pbkdf2:sha1,salt_length=8):这个函数将原始密码作为输入,以字符串形式输出密码的哈希值。method和salt_length的默认值能满足大多数需求,这个用于注册,传入密码

    check_password_hash(hash,password):这个函数参数是哈希值和用户输入的密码。返回值为True表示密码,用于用户验证,传入用户输入的密码和哈希值

    5.关联关系

    5.1一对多建立模型

    学生模型:

    class Student(db.Model):
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        s_name = db.Column(db.String(20),unique=True,nullable=False)
        s_age = db.Column(db.Integer,default=1)
        s_grade = db.Column(db.Integer,db.ForeignKey('grade.g_id'),nullable=True)
        __tablename__ = 'student'
    

    班级模型:

    class Grade(db.Model):
        g_id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        g_name = db.Column(db.String(20),unique=True)
        g_desc = db.Column(db.String(100),nullable=True)
        g_time = db.Column(db.Date,default=datetime.now)
        students = db.relationship('Student',backref='stu',lazy=True)
    
        __tablename__ = 'grade'
    

    5.2 查询

    • 通过班级查询学生信息

      查询班级id为1的班级的学生信息

      students = Grade.query.get(id).students
      
    • 通过学生信息查询班级信息

      查询id为1的学生的班级信息

      grade = Student.query.get(1).stu
      

    表的外间由db.ForeignKey指定,传入的参数是表的字段。db.relationship 它声明的字段不作为表字段,第一个参数是关联的类的名字,backref是一个反向身份代理,相当于在Student类中添加了stu属性。可以直接在Students的实例.stu 就可以得到相对应的grade对象。 一般来说relationship写在 一对多的一这一边

    5.3数据库迁移

    5.3.1 安装migrate
    pip install flask-migrate
    
    5.3.2配置使用migrate
    • 初始化,使用app和db进行migrate对象的初始化

      from flask-migrate import Migrate
      #绑定app和数据库
      Migrate(app=app,db)
      
    • 在Manager()对象上添加迁移指令

      from flask_migrate import Migrate,MigrateCommand
      
      app = Flask(__name__)
      manage = Manage(app=app)
      manage.add_command('db',MigrateCommand)
      
    • 终端操作

      python manage.py db init  初始化  只需要在第一次时调用
      python manage.py db migrate 生成迁移文件
      python manage.py db upgrade 执行迁移文件中的升级
      

    相关文章

      网友评论

          本文标题:Python_Flask 基础2

          本文链接:https://www.haomeiwen.com/subject/lqhuaftx.html