基于Python的Flask Web应用开发

应用基本结构使用(安装与使用)

 

1.安装虚拟环境python -m venv venv

 

2.激活虚拟环境:.\venv\Scripts\activate

 

出错就用该命令: set-ExecutionPolicy RemoteSigned

 

3.安装flask ,其命令:pip install flask

 

4.在根目录创建app.py 

from flask import Flask

app = Flask(__name__)

@app.route('/')

def index():

    return '<h1>hello world!</h1>'

 

5. flask run 运行该文件

6.结束:deactivate -退出虚拟环境

 

————————————————

编程的方式运行py文件的方法:

程序的最后加上以下代码:

if__name__'__main__':

 app.run(debug=True,host='0.0.0.0',port=8090)

 

其中,debug代表吊事模式,host代表服务器主机IP,post代表服务器端口号,可选

运行方法为,终端输入python 文件名.py +回车

 

————————————————————

Python-dotenv

用python-dotenv管理环境变量

1.装包:pip install python-dotenv

2.根目录创建名为.laskenv的文件

3.设置环境变量的值,例如

FLASK_APP='hello.py'

FLASK_RUN_HOST='0.0.0.0'

FLASK_RUN_PORT='8090'

FLASK_DEBUG='True'

#FLASK_ENV='development' flask2.3版本取消

 

 

pipenv环境下使用python-dotenv管理环境变量

pip install python-dotenv安装python-dotenv

 .env用来包含敏感信息的环境变量,如Email服务器账号密码

 .flaskenv用来存储和Flask相关的公开环境变量,如FLASK_AP

 

 

 

路由映射关系

cge9g2zcbNrAF4uSfJeQuQ.png?w=375&h=182

url_for()函数 ——反转函数

 

————————————————————————————————

模板

继承语法{% extends "模板名称" %}

块的概念

-父模块

-{% block 块的名称%}

-{% endblock %}

 

模板渲染4个步骤:

  1. 在根目录下,创建templates文件
  2. 在templates目录下,准备一个或多个html文件
  3. 导入render_template包
  4. 通过render_template('index.html')实现模板的渲染

 

模板中的可控制语句——if语句(写在网页文件)

{%if 条件%}

{%else%}

{%endif%}

 

模板中的控制语句——for语句

for 目标 in 对象:

-循环体

{% for 目标 in 对象 %}

<p></p>

 

模板

模板的继承语法:

{% extends "模板名称" %}

块的概念

-父模块

{% block 块的名称 %}

{% endblock %}

 

-子模块

{% block 块的名称 %}

子模块中的代码

 

-------------------------

bootstrap

使用Flask-Bootstrap集成Bootstrap

Bootstrap是Twitter开发的一个开源Web框架,提供用户界面组件可用于创建整洁切具有吸引力的网页,兼容所有现代的桌面和移动平台Web浏览器

  • Bootstrap是客户端框架,不会直接涉及服务器。
  • 服务器提供引用Bootstrap层叠样式表(CSS,cascading style sheet)和JavaScript文件的响应,并在HTML、CSS和JavaScript代码中实例化所需的用户界面元素。这些操作最理想的执行场所就是模板。
  •  

 

flask-bootstrap

-pip install flask-bootstrap 安装包安装

from flask_bootstrap import Bootstrap 导入包

-bootstrap = Bootstrap(app)

-将应用实例作为参数传递给架构造函数,再用中使用一个包含所有Bootstrap

文件和一般结构的模板

 

{{}} 里边放变量名称

—————————————————————————————————————————

{% extends'bootstrap/base.html' %} 引入基模板(用于修改标题)

{% block title %}Flask{% endblock %} 标题块

{% block navbar %} 导航快

{% block content %} 主体内容块

{% extends 'base.html' %}

 

 

模板

{% block page_content %}  

    <p>系统异常</p>  

{% endblock %}

{% block title %}

{% endblock %}

 

https://v5.bootcss.com/

中文文档

https://v5.bootcss.com/docs/5.1/getting-started/introduction/

下载

https://v5.bootcss.com/docs/5.1/getting-started/download/

 

 

Session的基本配置

Session的基本使用

  1. 设置Session主要是通过session['name']='value'来完成,name代表的是变量名称,value代表的是变量的值
  2. 获取Session的值

result=session['name']: 如果内容不存在将会报错

result=session.get('name'): 如果内容不存在,将返回None

  1. 删除Session的值或清空Session所有值

删除单个Session的值,可以使用Session.pp('key')这个方法,如果清除多个Session的值,可以使用Session.clear方法

  1. 设置Session的过期时间

未设置则默认为关闭浏览器失效。session.perment=True可在flask下有效时长一个月

 

定义收藏夹图标

<link rel="icon" href="{{url_for('static',filename='favicon.ico')}}">

 

 

 

数据库

安装与使用

安装包:pip install flask-sqlalchemy

导包:import flask_sqlalchemy import SQLAlchemy

实例化: db=SQLAlchemy(app)

db对象是SQLAchemy类的实例,表示应用使用的数据库。

配置数据库:

 

basedir=os.path.abspath(os.path.dirname(__file__)) #获取当前项目的位置

app.config['SQLALCHEMY_DATABASE_URI']='sqlit:///'+os.path.join(basedir, 'data.sqlite') #用拼接的方式,生成数据库的地址

app.config['SQLALCHEMY_TRACK_MODIFICATTIONS']=False

db=SQLAlchemy(app)

 

进入:flask shell

退出:exit()

以类的方式建表:

 

 

 

 

定义模型

类变量__tablename__定义在数据库中使用的表名。

db.Column类构造函数的第一个参数是数据库列和模型的类型

(db.Column定义)

类型名

Python类型

说明

Integer

int

普通整数,通常为32位

 

 

 

 

实例化:

db=SQLAlchemy(app)

 

 

#定义模型

class Role(db.Model):

    __tablename__='roles'

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64), unique=True)

    def __repr__(self):

        return '<Role %r>' % self.name

class User(db.Model):

    __tablename__='users'

    id = db.Column(db.Integer, primary_key=True)

    username = db.Column(db.String(64), unique=True, index=True)

    def __repr__(self):

        return '<User %r>' % self.username

 

 

 

 

创建:db.create_all()

赋值:admin_role = Role(name='Admin')

写入:db.session.add(admin_role)

提交:db.session.commit()

查看:print(admin_role.id)

 

 

 

数据库操作

>>> from app import db

>>> db.create_all()

>>> from app import Role,User

>>> admin_role=Role(name='Admin')

>>> mod_role=Role(name='Moderator')

>>> user_role=Role(name='User')

>>> user_join=User(username='john',role=admin_role)

>>> user_susan=User(username='susan',role=user_role)

>>> user_david=User(username='david',role=user_role)

>>> db.session.add(admin_role)

>>> db.session.add(mod_role)

>>> db.session.add(user_role)

 

>>> db.session.add(user_join)

>>> db.session.add(user_susan)

>>> db.session.add(user_david)

输出ID

>>> db.session.commit()

>>> print(admin_role.id)

1

>>> print(mod_role.id)

2

>>> print(user_role.id)

3

>>>

 

修改:

>>> admin_role.name='Administrator'

>>> db.session.add(admin_role)

>>> db.session.commit()

>>> print(admin_role)

<Role 'Administrator'>

 

 

删除

>>> db.session.delete(mod_role)

>>> db.session.commit()

>>> print(mod_role)

<Role 'Moderator'>

>>> db.session.delete(mod_role)

>>> db.session.commit()

<console>:1: SAWarning: DELETE statement on table 'roles' expected to delete 1 row(s); 0 were matched. Please

set confirm_deleted_rows=False within the mapper configuration to prevent this warning.

 

查询:

>>> Role.query.all()

[<Role 'Administrator'>, <Role 'User'>]

>>> User.query.all()

[<User 'john'>, <User 'susan'>, <User 'david'>]

>>> User.query.filter_by(role=user_role).all()

[<User 'susan'>, <User 'david'>]

 

查看sql语句

>>> str(User.query.filter_by(role=user_role))

'SELECT users.id AS users_id, users.username AS users_username, users.role_id AS users_role_id \nFROM users \nWHERE ? = users.role_id'

 

 

退出之后:

>>> exit()

PS D:\2022年秋季学期\pythonweb应用开发\10\flask_SQL> flask shell

Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)] on win32

App: app [production]

 

>>> from app import db

 

>>> from app import Role,User

>>> user_role=Role.query.filter_by(name='User').first()

>>> print(user_role)

<Role 'User'>

>>>

>>> users=user_role.users

>>> users

[<User 'susan'>, <User 'david'>]

>>> users[0].role

<Role 'User'>

 

 

AgAAEXi_O07WE4uJSeNETZ3-Iw_owQL_.png?w=430&h=205

 

 

 

生成需求文件 pip freeze >requirements

pip install -r requirments.txt

 

 

 

 

  1. 数据库使用步骤:

(1)装包: pip install flask-sqlalchemy

(2)导包:from flask_sqlalchemy import SQLAlchemy

(3)数据库的配置:

basedir=os.path.abspath(os.path.dirname(__file__)) #获取当前项目的位置

#数据库的配置

app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///'+os.path.join(basedir, 'data.sqlite') #用拼接的方式,生成数据库的地址

app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False

(4)实例化:db=SQLAlchemy(app)

(5)定义表的模型

#定义模型

class Role(db.Model):

    __tablename__='roles'

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(64), unique=True)

    def __repr__(self):

        return '<Role %r>' % self.name

class User(db.Model):

    __tablename__='users'

    id = db.Column(db.Integer, primary_key=True)

    username = db.Column(db.String(64), unique=True, index=True)

    def __repr__(self):

        return '<User %r>' % self.username

 

(6)建库建表

@app.route('/')

def index():

    db.create_all()# 建库建表

    admin_rol = Role(name='Admin')#赋值

    db.session.add(admin_rol)#2 add()方法添加

    db.session.commit() #3 commit()提交

    # 查询结果

    aaa=Role.query.all()

    print(aaa)

    return 'app'

 

  1. 数据库的增、删、改、查

新的路由和视图函数去完成

(1)添加数据:3个步骤:

准备数据——session.add()添加

session.commit()提交

(2)数据查询:query.all()/first()

使用query.first/all(查询的条件)方法找到相应的对象(记录),然后就可以输出。

.all()所有的 .first()第一条

(3)修改数据的方法:add()方法--commit()

数据修改必须使用query.filter()方法查找到相应对象(记录),

然后使用再对该对象的属性值进行修改。

 

(4)删除操作:delete()方法--commit()

数据删除必须使用query.filter()方法查找到相应对象(记录),

然后使用db.session.delete(对象名)方法进行删除。

 

 

课本53页

db.session.add(admi_role)

db.session.delete(mod_role)

不管修改还是删除,都需要db.session.commit()提交

 

数据库实体间有3种关联关系:一对一、一对多、多对多。

 

 

删除弹窗

@app.route('/delete/<int:movie_id>',methods=['POST']) #动态路由,加支持POST方法

def delete(movie_id):

    movie=Movie.query.get_or_404(movie_id) # 删除的id值用变量来做决定

    # 对象怎么定?movie是谁?  删除的id值用变量来做决定

    db.session.delete(movie)

    db.session.commit()

    return redirect(url_for('index'))

 

<form action="">

         <input type="submit" value="删除" class="btn btn-outline-danger"

          οnclick="return confirm('你确定要删除吗?')">

                </form>

 

 

--------------------------------------------

 

 

 

 

Flask-Migrate数据迁移

8个步骤:

  1. 装包 pip install flask-migrate
  2. 导包 from flask-migrate import Migrate
  3. 实例化(位置) migrate=Migrate(app,db) 注: 放在app与db中间
  4. 创建migrations文件夹,做准备

在终端输入flask db init命令

AgAAEXi_O05PCvBwxk9GXavTDm8TyIuM.png?w=829&h=155

注:这个命令会创建migrations目录(文件夹),所有迁移脚本都存放在这里

AgAAEXi_O05apgdXKQdOJJyFVn0qbjA3.png?w=174&h=134

 

5.修改模型

6.创建迁移脚本

flask db migrate

7.调整

8.迁移应用到数据库

flask db upgrade / flask db stamp

 

 

--------------------------------------------------------------------------------------------------------

先分享到这里吧,可能不是很好看,找个时间我详细划分,整好看点

第一次发博客,有点紧张

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值