生产环境&开发环境
开发环境:在本地编写和测试程序时的计算机环境
生产环境:网站部署上线供用户访问时的服务器环境(默认)
修改方法:https://www.jianshu.com/p/0125d0df0302
FLASK_ENV = development
如果出现了下面的警告:
是因为这里我们没有设置环境。默认是生产环境,而生产环境下,flask需要使用uWSGI启动服务。需要添加下面两行代码:
from gevent import pywsgi
再次启动程序,运行时只有以下信息:
此时访问服务器是可以成功运行的。
如果更改了默认的环境:
那么就不需要添加上面两行代码了,不会出现警告信息。因为此时修改成了开发环境,开发环境下可以使用app.run()的方式进行启动。
调试模式
启动调试模式,服务器会在代码修改后自动重新载入(而无需手动重启),并在发生错误时提供一个能获得错误上下文及可执行代码的调试页面。 (注意:开启调试模式会成为一个巨大的安全隐患,因此它绝对不能用于生产环境中。)
方法一:
app.debug = True
app.run()
方法二:
app.run(app.debug=True)
PyCharm快捷键
将鼠标放在括号中,按ctrl+p
可以看到这个函数都有哪些参数。
lsof -i:5000
:把占用5000端口的程序杀死。
编译器中使用 ctrl+f
出现搜索界面。
按两下shift
键可以弹出搜索页面,搜索你想前往的文件的文件名。
项目中的小问题
json、ajax、密码加密AES算法(sha256算法)
为何记录最后一次登陆时间?为了统计日/月活跃数
g对象
绑定了user_login_data装饰器,则每次执行时,都会先执行此装饰器中的代码,这里user_login_data装饰器里把user对象绑定到了g对象中,所以使用了此装饰器的函数后面就可以使用了,直到最后一个return语句执行完毕,g对象将被销毁。
为什么要写一个这样的装饰器呢?因为本项目很多地方都需要用到user对象(比如点击评论时,点击收藏时,都需要对数据库中的内容进行修改,而在此之前,都是需要先判断用户是否登陆的,也就是user对象是否不为None),如果不定义一个专门的装饰器,那么每一处使用到user的区域,都要写一段取user的代码(也就是装饰器里执行的那些语句),这样就使代码变得冗余了。
数据库
-
有关对数据库的操作,需要用try except, 因为是数据库可能是一台远程的服务器。
-
如何执行sql文件:
请求方式
涉及到对数据库的修改的话,就用post请求;仅仅查询操作,使用get请求方式。比如浏览器上使用?来查询不同页面,就是属于get请求;输入表单进行登录时就是post请求。
断点调试
- 如果想断点调试一个视图函数,原则是在此视图函数的第一行打断点。
- 如果想调试前端代码,原则是在click点击函数的第一行打断点(原因:这样在点击相应的那个按钮时,可以监听究竟能不能来到断点这里),然后再在回调函数第一行打断点(原因:视图函数能否正确的给我们一个返回结果)。
两种返回内容
三种获取数据的方式
request.args
:获取url中问号后面的查询参数(以get或post请求方式,都可以)
用args得到的是字典,所以可以用get()方法
request.data
/request.json
:获取以post请求方式提交的json数据
request.form
:获取以post请求方式提交的表单(form)数据(request.form.get(title)
表示获取htm页面里的form表单里的input标签里(也可以是其他标签,只要这个标签对应的是可以修改值的,就是用这个语句进行获取它的值)的name属性为title的输入框中输入的值)
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['GET', "POST"])
def quickflask():
# 1 获取url中问号后面的查询参数
name = request.args.get("name")
print("name = %s" % name)
# 2 获取以post请求方式提交的json数据
#dict_data = request.json # 此行语句相当于:request.data, json.load(request.data)
#print(dict_data)
# 3 获取以post请求方式提交的表单(form)数据
dict_form = request.form
print(dict_form)
return 'hello'
if __name__ == "__main__":
app.run(debug=True)
-
request.args
结果: -
request.data
/request.json
结果: -
request.form
结果:
后端接口功能实现的大致思路
- 获取参数并做校验
- 操作数据库(设置了自动提交)
- 返回响应
要处理的业务,写成了视图函数。视图函数可以用render_template()返回到一个完整页面,也可以是使用jsonify()进行部分数据的修改(这说明是使用ajax提交的,是位于js中的数据)。前后端是如何连贯运行起来的呢?打开浏览器在相应的js文件中打两个断点,在视图函数处打一个断点。运行查看流程、数据的变化即可。
如果想完成一个按钮的功能,比如“审核”按钮,想整个完成审核流程的话,大致流程如下:首先想想这个审核按钮位于哪个html页面,你需要在这里进行修改,以使得点击审核按钮后,能够先转到对应的页面。之后,你需要写视图函数了,视图函数要完成后端的逻辑操作,比如数据库中相关数据的更改。要通过get方法从页面里获取参数,可能需要读js代码(见上 “三种获取数据的方式”),这样才能知道参数的名称。
与日期有关的几个函数
import time
from datetime import datetime, timedelta, date
# 获得当前时间(可表示出年月日、时分秒、本日是本周/年的第几天)
localtime = time.localtime()
# 获得当前时间(可表示出年月日、时分秒)
now_time = datetime.now()
# 设置时间跨度,日期对象可以和设置的这个时间跨度做加减运算
days_time = timedelta(days=2)
# 创建一个指定的日期对象
date_time = date(2020, 5, 20)
# 把日期的字符串表示转化成日期对象
d_str = "2020-5-20"
d_date = datetime.strptime(d_str, "%Y-%m-%d")
# 把日期对象转化成日期的字符串表示
date_str = datetime.strftime(d_date, "%Y-%m-%d")
断点调试
断点调试真的很好用。可以看到各种变量的值,即每一步执行结果是什么样的都能看出来了,也就方便检查出错误了。
页码调整
需要到html文件中修改以下代码:
关于部署
不再使用Pycharm右键运行,这实际上使用的是flask子弟的WSGI服务器运行的,它满足不了多用户的访问。使用Gunicorn,它提供的是服务器的角色。Ndinx充当的是转发/分流/负载均衡服务器的角色。
startflask快捷键
改变运行端口
app.run()
app.run(port=5001)
manager.run()
在命令行启动runserver的时候使用命令:python manage.py runserver -p 5001