Python: Flask后端与webapi

和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 退出(需确认) 。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值