#### Flask 常用技术 #### AJAX 动态数据请求 ##### AJAX + AJAX (Asynchronous JavaScript And XML) : 异步的 Javascript 和 XML + 不属于一种新的编程语言,是一种方法用于使用现有标准,在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页 ##### 基于 JQ 的 AJAX 请求 + 基本语法 ``` jQuery.ajax([settings]) ``` + 常用配置 | 配置 | 描述 | | ------------- | ------------------------------------------------------------ | | `async: true` | 默认值 true.默认值下所有请求均为异步请求.如果需要发送同步请求,设置为 false | | `data` | 发送到服务器的数据.将自动转换为请求字符串格式.GET 请求中附加到 URL 后 | | `dataFilter` | 给 AJAX 返回的原始数据的请求进行预处理的函数 | | `dataType` | 预处理服务器返回的数据类型,flask 中 jsonify 库将 python 字典中数据转为 json 对象 | | `error` | 自动判断 (xml 或 html).请求失败时调用 | | `success` | 自动判断 (xml 或 html).请求成功后的回调函数 | | `type` | 默认值 : "GET", 请求方式 ("POST" 或 "GET"),其他 HTTP 请求方法也可以使用 | | `url` | 发送请求地址 | + 例子 ``` ``` #### Flask-SQLAlchemy 分页 + 基本语法 ``` paginate(page=None, per_page=None, error_out=True, max_per_page=None) ``` + 参数 | 参数 | 描述 | | ------------ | -------------------------------------------------- | | page | 指定页码,从 1 开始 | | per_page | 每一页有几项 | | error_out | 是否抛出错误,当其为 True 时,会抛出 404 | | max_per_page | 当指定了 max_per_page 时,per_page 受到这个值得限制 | + 常用方法 | 方法名称 | 描述 | | ---------- | ------------------------------------- | | has_next() | 是否还有下一页 | | has_perv() | 是否还有上一页 | | items | 当前页的元素集合 | | next | 返回下一页的 Pagination 对象 | | next_num | 下一页页码 | | page | 当前页页码 | | pages | 匹配的元素在当前配置一共有多少页 | | per_page | 每一页显示元素个数 | | perv | 上一页的 Pagination 对象 | | perv_num | 上一页页码 | | query | 创建 Pagination 对象对应的 query 对象 | | total | 匹配的元素总数 | + 分页使用 + 视图函数 ````python # 分页测试 @userbp.route('/fytest/') def fytest(): # 所有的职员 # person_obj_list = Person.query.all() # print(person_obj_list) # 第一个参数开始的页码,例如第几页 # 第二个参数,每一页返回的数据条数 pagination_obj = Person.query.paginate(2, 1) # print(pagination_obj) # # print(pagination_obj.items) # 获取具体的对象 # print(pagination_obj.has_prev) # 判断是否有上一页,如果有返回True 否则返回False # print(pagination_obj.has_next) # 是否有下一页,如果有返回True 否则返回False # print(pagination_obj.prev_num) # 上一页页码。如果没有返回None # print(pagination_obj.next_num) # 下一页页码。如果没有返回None # print(pagination_obj.page) # 当前页码。 # print(pagination_obj.pages) # 总页码数 # print(pagination_obj.iter_pages()) # 可以循环遍历生成页码。 for page in pagination_obj.iter_pages(): print(page) return '分页...' @userbp.route('/person_list/') @login_check def person_list(): # 0.获取前端传递过来的页码 page = int(request.args.get('page', 1)) # 1.查询数据库中的数据 pagination_obj = Person.query.paginate(page, 1) person_obj_list = pagination_obj.items # 3.判断页码范围 if page <= 3: start = 0 end = 5 elif page > pagination_obj.pages - 3: start = pagination_obj.pages - 5 end = pagination_obj.pages else: start = page - 3 end = page + 2 # 2.生成页码(使用自带的iter_pages效果不好) page_page = range(1, pagination_obj.pages + 1)[start:end] return render_template('person.html', person_obj_list=person_obj_list, page_page=page_page, pagination_obj=pagination_obj) ```` + html ```html ``` #### 项目部署 ##### 安装 Flask 环境 1. 导出虚拟环境中的 Flask 开发环境: `pip freeze > package.txt` 2. 将包目录上传至服务器,并进行安装 1. 将 package.txt 放在 /opt 目录下 2. 安装 `pip3 install -r package.txt` 3. 可以换源下载 `pip3 install -r package.txt -i 源地址` ##### 启动 Flask 项目 1. 上传 Flask 项目 至 /opt 目录下 1. 修改项目中 main.py 开放端口为 0.0.0.0 2. 启动项目,可能涉及关闭防护墙 ``` python3 main.py run systemctl stop firewalld ``` 3. 访问项目测试 ##### uWSGI 转接 Nginx 服务器 1. 安装 uWSGI : `pip3 install uwsgi` 2. 创建软链接 : `ln /usr/local/python3/bin/uwsgi /usr/bin/wsgi` ##### Nginx 1. 下载 Nginx : `wget -c https://nginx.org/download/nginx-1.12.2.tar.gz` 2. 安装 Nginx : 1. 解压 : `tar -zxvf nginx-1.12.2.tar.gz` 2. 在解压目录下的编译安装 : `./configure`然后 `make && make install` 3. 创建软链接 : `ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx` 4. 启动 Nginx 并查看 : `nginx` 5. Nginx 常用命令 1. `nginx -s stop` : 停止 nginx 2. `nginx -s reload` : 重启 nginx 3. `nginx -t` : 检测是否正确 ##### Flask + uWSGI + Nginx 部署 1. wWSGI 配置文件 + 在 /opt 下创建 scripts 目录,编写 uWSGI 配置文件 ``` [uwsgi] socket=127.0.0.1:5000 // uWSGI 启动地址及端口 pythonpath=/opt/FlaskOAPro // 项目木目录 module=main // 项目控制文件名,不加 .py wsgi-file=/opt/FlaskOAPro/main.py // 项目控制文件目录 callable=app // 控制文件当中 app 的名称 processes=4 threading=2 daemonize=/opt/scripts/uwsgi.log ``` 2. Nginx 配置文件 1. 进入配置文件目录 : `/usr/local/nginx/conf/` 2. 进行 `nginx.conf` 备份 : `cp nginx.conf nginx.conf.bak` 3. Nginx 配置文件修改 ``` server { listen 80; server_name FlaskOAPro; # charset koi8-r; # access_log logs/host.access.log main; access_log logs/host.access.log; error_log logs/host.error.log; loation / { include uwsgi_params; uwsgi_pass 127.0.0.1:5000; uwsgi_param UWSGI_CHDIR /opt/FlaskOAPro; uwsgi_param UWSGI_SCRIPT main:app; } } ``` 3. 启动项目 1. 在 `/opt/scripts` 下启动 uWSGI : `uwsgi --ini uwsgi.ini` 2. 启动 Nginx 4. 访问项目