和django相比,Flask真是轻。也没那么多复杂。
一、简单模版
下面是__init__.py文件:
import os
from flask import Flask
from flask_cors import CORS # 导入模块
from markupsafe import escape
from flask import request
import json
from flask import jsonify
from flask_login import login_manager, UserMixin
import pandas as pd
#from flask_cors import cross_origin
def create_app(test_config=None):
# create and configure the app
app = Flask(__name__, instance_relative_config=True)
CORS(app, supports_credentials=True) # 设置跨域
app.config.from_mapping(
SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)
if test_config is None:
# load the instance config, if it exists, when not testing
app.config.from_pyfile('config.py', silent=True)
else:
# load the test config if passed in
app.config.from_mapping(test_config)
# ensure the instance folder exists
try:
os.makedirs(app.instance_path)
except OSError:
pass
## 无变量
@app.route('/', strict_slashes=False)
def index():
username = request.cookies.get('username')
## 单变量或无变量,只能GET
@app.route('/hello/<username>',methods=['GET'], strict_slashes=False)
def hello(username):
return f' Hello, {escape(username)}'
## 登陆
@app.route('/login', methods=['POST'],strict_slashes=False)
def login(): ## 以下只是示例,返回token
if valid_login(request.form['username'],request.form['password']):
token = request.form['username']+ "--abcdefghighk1234567--" + request.form['password']
return token
else:
error = 'Invalid username/password'
return "------error------"
## 多变量,可以接受POST和GET,均可
## 取特定标的、日期范围的数据
@app.route('/data/<string:code>/<string:startdate>/<string:closedate>/',methods=['POST',"GET"], strict_slashes=False)
def get_data(code,startdate,closedate):
## 需要比照用户名和token
if request.method == "POST":
csv_path = r"C:\Users\admin\Desktop\test.csv"
df = pd.read_csv(csv_path)
dict = df.to_dict("dict")
json = jsonify(dict) #df.to_json(orient = "table") #'table',values
return json
else:
data = {
"code": code,
"startdate": startdate,
"closedate": closedate,
"data" :{"code":code,"close":[1.0,2.0,3.0,4.0]}
}
json_str = jsonify(data) ## 用jsonify好,不推荐json.dumps(data)
return json_str
## 方法结束
return app
# if __name__ == '__main__':
# app = create_app()
# app.run(host="0.0.0.0", port=5000, debug=True)
def valid_login(username,password): # only test!
user_names = ["test"]
if username in user_names and password != "":
return True
else:
return False
def log_the_user_in(username):
pass
二、WINDOW环境
1、安装和环境
具体可以参考:
https://dormousehole.readthedocs.io/en/latest/
很详细,一步步来。
2、几点说明
(1)所有的操作在venv中进行,包括下载包和程序运行。
python3 -m venv venv 创建虚拟环境
或者,如果不行,试试下面这个:
py -3 -m venv venv
(2)设置跨域很重要
CORS(app, supports_credentials=True) # 设置跨域,很重要!!
(3)init.py是入口或改成app.py
(4) 关于render_templates与templates文件夹位置
如果templates文件夹位置不对,render_templates函数一直会找不到相应的html文件,哪怕你写的是绝对路径。
在上面,web_api是FLASK_APP; templates文件夹应与__init__.py在同一级目录下。这样就没有问题了。
(5)运行前的操作:【操作的路径很重要!!!!】
假定需要创建一个名为dingtou的目录(其中, web_api为具体项目名称,需要根据自己情况配置,就是__init__.py的文件夹):
在dingtou 目录 下(注意:目录不对,会找不到,这个很重要!!!!!!),分别:
python3 -m venv venv # 或 py -3 -m venv venv
venv\Scripts\activate
在 venv下:
set FLASK_APP=web_api
set FLASK_ENV=development
flask run
注意:cmd和powershell的操作还不一样。
相当于开放外网而不仅是本地访问的权限,
>flask run --host=0.0.0.0
外网是否能访问还要设置好防火墙:
Usage: flask run [OPTIONS]
Run a local development server.
This server is for development purposes only. It does not provide the
stability, security, or performance of production WSGI servers.
The reloader and debugger are enabled by default if FLASK_ENV=development or
FLASK_DEBUG=1.
Options:
-h, --host TEXT The interface to bind to.
-p, --port INTEGER The port to bind to.
--cert PATH Specify a certificate file to use HTTPS.
--key FILE The key file to use when specifying a
certificate.
--reload / --no-reload Enable or disable the reloader. By default
the reloader is active if debug is enabled.
--debugger / --no-debugger Enable or disable the debugger. By default
the debugger is active if debug is enabled.
--eager-loading / --lazy-loading
Enable or disable eager loading. By default
eager loading is enabled if the reloader is
disabled.
--with-threads / --without-threads
Enable or disable multithreading.
--extra-files PATH Extra files that trigger a reload on change.
Multiple paths are separated by ';'.
--help Show this message and exit.
三、ubuntu开发环境
其中,flaskyi替换成具体项目的名称:
在前入venv前(项目路径下):
python3 -m venv venv
source venv/bin/activate
在前入venv后:
export FLASK_APP=flasky
flask run
四、ubuntu生产环境[碰到问题]
待续…
flask run --host=0.0.0.0
如果在venv环境中找不到pip,请用:
python -m pip install --upgrade pip
关闭虚拟环境
deactivate
如何找不到flask(No module named flask 错误解决),可以:
virtualenv flask
部署Flask环境
在本地生成requirements.txt文件
pip freeze > requirements.txt
然后在服务器虚拟环境中安装requirements.txt依赖
pip install -r requirements.txt
sudo apt-get install uwsgi-plugin-python
网页访问:
$ sudo apt-get install w3m
$ w3m www.baidu.com
注意w3m命令, 按q 退出(需确认) 。