Flask 环境配置及项目的初始化(一)

项目环境配置

安装python环境

校验python 和pip是否安装好

//查看python安装
python -V
//查看pip安装
pip -V

新建项目文件夹 demo

mkdir flaskdemo
cd flaskdemo

安装 pipenv

pip install pipenv
# 这个是进行虚拟环境管理的工具,不同的项目分割不同的环境

进入到项目文件夹下,安装虚拟环境

//创建虚拟环境,如果里面有配置文件,会直接安装配置中的插件
pipenv install
//激活虚拟环境
pipenv shell
//退出
exit
//卸载包
pipenv uninstall flask
//查看包依赖关系
pipenv graph
//进入虚拟环境中,查看虚拟环境的安装目录
pipenv --venv

tips:在windows退出环境时没有提示,linux有提示

安装各种包:一下为基础通用的各种包,选择安装。

# 安装flask
pipenv install flask
# mysql驱动
pinenv install cymysql==0.9.1   
# web登录插件   
pipenv install flask-login
# email插件
pipenv install flask-mail
# 表单字段校验插件
pipenv install WIForms
# 请求库插件
pipenv install requests
# 数据库映射插件
pipenv install Flask-SQLAlchemy
# 验证登录相关
Flask-HTTPAuth==2.7.0
# 其他相关
Flask-Cors==2.1.0
Flask-WTF==0.14.2

开发工具: Pycharm,Xampp(mysql),Navicat(数据库可视化工具)

项目的初始化

新建配置文件:新建文件目录 app/config, 新建配置文件 secure.py 和 settings.py,主要存储项目中的配置信息

创建自定义 app/libs/redprint.py flask默认的是blueprint主要用作模块的区分,不建议为了分离视图是用 blueprint,可以优化url的路径

# 根据 blueprint源码的实现
class RedPrint:
    def __init__(self, name):
        self.name = name
        self.mound = []

    def route(self, rule, **options):
        def decorator(f):
            self.mound.append((f, rule, options))
            return f

        return decorator

    def register(self, bp, url_prefix=None):
        """
        将 redprint注册到 blueprint,实际调用 blueprint代码
        """
        if url_prefix is None:
            url_prefix = '/' + self.name
        for f, rule, options in self.mound:
            endpoint = options.pop("endpoint", f.__name__)
            bp.add_url_rule(url_prefix + rule, endpoint, f, **options)

创建视图函数文件

from app.libs.redprint import RedPrint

api = RedPrint('book')

@api.route('/create')
def create_book():
    return 'create_book'

@api.route('/get')
def get_book():
    return 'get_book'

------------------------------------------------------

from app.libs.redprint import RedPrint

api = RedPrint('user')

# url /v1/user/create

@api.route('/create')
def create_user():
    return 'create_user'

@api.route('/get')
def get_user():
    return 'get_user'

在 v1/init.py 注册 redprint

from flask import Blueprint
from app.api.v1 import book
from app.api.v1 import user

def create_blueprint_v1():
    """
    创建 blueprint 并对 自定义的 redprint进行注册
    :return:
    """
    bp_v1 = Blueprint("v1",__name__)
    book.api.register(bp_v1, url_prefix='/book')
    user.api.register(bp_v1, url_prefix='/user')
    return bp_v1

新建 ginger/app.py文件,flask核心对象相关的初始化的操作
tips:进入之后,可能包不能导入,需要自己手动确认设置虚拟环境

from flask import Flask

def register_blueprint(app):
    from app.api.v1 import create_blueprint_v1
    blueprint = create_blueprint_v1()
    app.register_blueprint(blueprint, url_prefix='/v1')

def create_app():
    app = Flask(__name__)
    # 导入配置文件
    app.config.from_object('app.config.settings')
    app.config.from_object('app.config.secure')

    # 注册blueprint
    register_blueprint(app)
    return app

其他相关

from flask import Flask
app = Flask(__name__)
# 导入配置文件,导入的是模块,app.config 是dict的子类
app.config.from_object('config')

# 定义路由规则
@app.route("/hello/") #这种方式底层也是通过 add_url_rule实现的
def hello():
    # 这种方式为函数视图
    # 另外一种基于类的视图(即插视图),可以复用便于扩展
    return "hello word"


# 启动,配置debug=true表明为debug模式,每次修改代码保存之后,会列出详细错误信息,服务器会自动重启,不用自己手动重启
#  这种方式的话不能被外网,局域网访问,只能通过 127.0.0.1这种方式访问
#  将host =‘0.0.0.0’的方式支持外网访问

# if 中的语句只在入口文件中执行
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=app.config['DEBUG'])

URl配置说明:

url配置为 "/hello/",可以兼容 url为hello,和url为hello/ 的情况,这种方式flask是通过 url重定向来实现的,为了是保证url的唯一性,跟seo的优化有关系. 
一般直接配置为 /hello

def hello():这种为函数视图的方式,还有另外一种方式,为基于类的视图(即插视图),基于类可以复用便于扩展

路由注册方式

#这种方式为装饰器的方式,查看源码底层也是采用的是 app.add_url_rule这种方式注册的
@app.route("/hello/")

#直接配置注册的方式,基于类的视图这种,必须是这种方式
app.add_url_rule('/hello',view_func=hello)

app.run()参数

默认的app.run(debug=True),这种方式是不能被外网,局域网访问,只能通过127.0.0.1这种方式访问

将host修改为 '0.0.0.0',可以允许外网访问,可以指定端口
app.run(host='0.0.0.0',port=5000,debug=True)

统一配置文件:一般的环境切换更改等方式通过配置文件的方式来,不易出错
创建配置文件 config.py

#config.py 配置示例
# encoding: utf-8
DEBUG =True     

一种方式:直接导入的方式
from config import DEBUG
app.run(debug=TEBUG)

导入模块的方式,注意路径,此时 config文件与 app同级,推荐这种方式
app.config.form_object('config')

**tips**
通过app.config 导入的方式,获取值的时候 key 必须大写,app.config['DEBUG'],否则会出错.

app.config['DEBUG'],即使在配置文件没有配置该 DEBUG,打印的时候 也会有值 false ,因为 DEBUG 是在app.config 默认参数,如果要覆盖该 DEBUG值,在配置文件中必须大写

if name == 'main'的作用

保证app.run()只会在入口执行,如果该文件被其他的模块导入的话,避免执行app.run(),在生产的环境中,一般是通过nginx+uwsgi来实现的,那么有该语句,当执行该模块时,app.run()就不会执行,不会开启flask的测试服务器.

tips:可能存在需要导包的情况,需要设置虚拟环境
file->settings->procject->project interpreter ->选择对应的虚拟环境即可

Restful

实际经验区分:

  • 标准的restful 适合对外提供,不用考虑太多的业务逻辑
  • 在内部项目中,如有多个资源,需要同时操作,那需要多次的 http请求,而且对资源的设计需要很高的要求.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容