这一篇主要写一些Controler的内容,包括Flask请求类和响应类,以及cookie和Session对象,View啊,模板继承,消息闪现,还有操作数据库等。
1,Flask请求
1,Request请求对象
Request请求对象封装了从客户端发来的请求报文,从中可以获取请求报文中的所有数据。请求解析和响应封装很多时候是由Werkzeug完成的,下面是一些request对象的属性和方法。
属性
method
(方法) :HTTP请求方法,如GET、POST、PUT、DELETE等。url
(URL) :请求的URL地址,包括协议、主机名、端口、路径和查询参数等信息。headers
(标头) :包含HTTP请求头的对象,可以访问和修改请求头信息。body
(主体) :请求主体数据,通常是POST请求中的表单数据、JSON数据或文件上传数据。params
(参数) :URL查询参数的对象,允许访问和修改查询参数。cookies
(Cookie) :请求中的Cookie信息,可以用于处理用户的会话状态。session
(会话) :如果使用会话管理,可以访问会话数据。remote_addr
(远程地址) :客户端的IP地址。user_agent
(用户代理) :客户端的用户代理字符串,用于识别浏览器或客户端设备信息。content_type
(内容类型) :请求主体的内容类型,通常用于指示请求主体是JSON、XML、表单等数据格式。
方法
get()
:用于获取请求参数的值,例如request.get("param_name")
用于获取查询参数的值。json()
:用于解析请求主体中的JSON数据,以便访问JSON对象。form
或POST
:用于获取POST请求中的表单数据,例如request.form["field_name"]
。files
:用于处理文件上传,允许访问上传的文件和相关信息。cookies
:用于获取和设置Cookie信息,例如request.cookies["cookie_name"]
。headers
:用于访问请求头信息,例如request.headers["header_name"]
。url
:用于访问请求的URL信息,例如request.url
。method
:用于获取请求的HTTP方法,例如request.method
。is_secure()
:检查请求是否使用了安全的HTTPS协议。is_ajax()
:检查请求是否是通过Ajax发送的。 tedboy.github.io/flask/gener...
1,获取get请求参数
request.args.get('age')从url中获取年龄
2,获取post参数
request.args.post() 表单的话使用request.form['username']
3,文件上传
前端内容由前端程序员编写,后端程序需要判断文件是否上传,已经上传的文件类型是否符合设定的要求,出于安全考虑,还需要防止恶意用户在文件名中嵌入代码,给文件设置一个随机不重复的文件名,uuid_uuid4()可以做到。
2,请求狗子
主要是对请求进行预处理和后处理,执行在视图前后的一些函数,用户可以在这些函数里面进行操作。 juejin.cn/post/703095...
3,Flask响应
1,Response响应对象
响应在Flask中使用Response对象表示,响应报文的大部分内容有服务器处理,大多数情况下值负责返回主体内容。
视图函数最多返回由3个元素组成的元组:响应主体,状态码和首部字段。 juejin.cn/post/710578...
2,响应格式
1,MIME
在http响应中,数据通过多种格式传输。大多数情况下使用HTML格式。不同的响应格式需要设置不同的MIME类型,MIME在首部的Content-Type字段定义。默认的HTML类型是 Content-Type:text/html;charset=utf-8
MIME类型如下:
- 纯文本: text/plain
- HTML: text/html
- XML: application/xml
- JSON: application/json
2, json
JSON是Javascript Object Notation(JavaScript对象表示法),是一种流行的、轻量的数据交换格式。XML具有高效的重用性,但体积较大,处理和解析的速度较慢。JSON轻量简洁,容易阅读和解析,兼容性也较好。类似于python的字典和列表。在flask中可以直接使用jsonify()函数来进行序列化,转化成JSON字符串作为响应主体,生成一个响应对象,并且设置正确的MIME类型。
4,Cookie和Session
5,模板上下文
docs.jinkan.org/docs/jinja2... 这是官方文档中文版的,主要看一下过滤器和自定义过滤器,局部模板,模板继承,消息闪现
6,消息闪现
flash(message,category)第二个参数是消息类型
使用flash函数发送的消息会存储在session中,需要在模板中使用全局函数get_flashed_messages()获取消息列表,来显示出来。
7,自定义错误页面
主要是使用错误处理函数加app.errorhandler()装饰器,出入错误代码作为参数。 例如
python
@app.errorhandler(404)
def page_not_found(e):
return reder_template('404.html'),404
使用Flask-SQLAlchemy管理数据库
1,连接数据库服务器
DBMS通常会提供数据库服务器运行在操作系统中。丽娜姐数据库要指定数据库URI(统一资源标识符)。数据库URI是一串包含各种属性的字符串。
数据库引擎 | URI |
---|---|
MySQL | mysql://username:password@hostname/database |
SQLite(Unix) | sqlite:////absolute/path/database |
SQLite(Windows) | sqlite:///c:/absolute/path/database |
示例连接 SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:root@localhost/mrsoft?charset=utf8mb4'
2,定义数据模型
数据模型是数据特征的抽象,它从抽象层次上描述了系统的静态特征,动态行为和约束条件,为数据库系统的信息表示和操作提供了一个抽象的框架。在ORM中模型是一个Python类,类的属性对应数据库表的列。
python
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
常用的列字段类型,关系选项,列选项,其他的请参考官方文档en.wikipedia.org/wiki/SQLAlc... blog.csdn.net/chichu261/a...
3,定义关系
例如,一个用户user可以对于一个role,一个role可以分配多个user,所有是一对多关系,在user表中设置外键引用role表的主键。
js
class Role(db.Model):
#...
users = db.relationship("User",backref="role",lazy="dynamic")
class User(UserMixin,db.Model):
#...
role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
多对多关系需要在关联表中指定名称 还得创建一个中间表用外键进行连接。
4,数据库操作
CRUE。创建,更新,读取和删除
1,创建数据
1,创建对象 2,将其添加到会话中 3,提交会话
2,读取数据
<模型块>.query.<过滤方法>.<查询方法>
常用的SQLAlchemy查询过滤器
过滤器 | 说明 |
---|---|
filter() | 把过滤器添加到原查询上,返回一个新查询 |
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
limit | 使用指定的值限定原查询返回的结果 |
offset() | 偏移原查询返回的结果,返回一个新查询 |
order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
常用的SQLAlchemy查询执行器
方法 | 说明 |
---|---|
all() | 以列表形式返回查询的所有结果 |
first() | 返回查询的第一个结果,如果未查到,返回None |
first_or_404() | 返回查询的第一个结果,如果未查到,返回404 |
get() | 返回指定主键对应的行,如不存在,返回None |
get_or_404() | 返回指定主键对应的行,如不存在,返回404 |
count() | 返回查询结果的数量 |
paginate() | 返回一个Paginate对象,它包含指定范围内的结果 |