裁员、清货、关门,盒马到底怎么了?

最近,各地盒马撤柜关门的消息,源源不断地冒出来。
有网友发现,自己买的盒马商品没人送货。送来的东西日期不新鲜,种类也变少了,爱喝的苹果汁下架了,常买的鸡肉也断货了。
就连我们办公室很多同事,也发现买到临期产品的概率变高了。
他还表示,这在曾经追求高质量的盒马,是绝不会发生的。
当有人贴出盒马货架被清空,既没人补货,店里也没有顾客的照片时。
差评君意识到这事有点不对头了啊。
可就在 3 个月前,盒马 CEO 侯毅还放出了豪言壮语,未来盒马的使命是 10 年 1 万亿和网友、同事的所见所闻一对比,这矛盾和冲突感,妥妥得拉满了。
差评君也大概了解了一下,去年 5 月的时候,盒马憋住一口气要上市,可惜最后没憋住,从那之后,似乎就在不断漏气了。
甚至于,一度传出了阿里要出售盒马的传闻。
虽然官方立马跳出来辟谣了,说没有的事。
但稍微留意一下,确实能发现盒马这日子是不太好过。
开头网友传的盒马关门,确实是存在的, 2 月底大连盒马门店就宣布停业。不过,盒马一向开关门速度飞快,效益不好了就直接砍掉。
根据知危编辑部采访到的武汉员工的说法, 3 月份,武汉还要再关 3 家。
不光是对亏钱的门店下手,在日常生活中,盒马也是能省则省。
 在一些帖子的下方,就有员工吐槽过盒马近乎离谱的省钱法子。
比如封厕所、不开门就不开灯,一关门立马关灯、一个人顶十个人用。巴不得一张厕纸,撕成两份使。
这省钱的算盘,还打到了员工的工资和合同上。
2 月初的时候,合肥等城市的门店,就只招收小时工或者兼职。像合肥后场拣货工,每件从 0.26 元,降到了 0.17 元。全国各地降薪幅度都在 20% 左右。
同时,盒马试图把正式员工转成外包三方员工
知危编辑部采访的武汉门店员工就告诉咱们,他在 2 月 18 号就收到了转临时工的通知。
取消五险一金、节假日三倍薪资、年假、十三薪,转为三方合同。要是不同意,就自己拍屁股滚蛋( 没有 N+1 )
 “ 有员工同意转了,还有哭着签字的。 ” 
受访者估算了一下,按一家店 20 个员工算,一年能给盒马省 40 万元。
这边疯狂地压榨员工,在消费者那边,盒马也是各种抠抠搜搜。
 以前免费提供的包装袋,现在每单强制收 1 元。在北京、南京、长沙的盒马,免送费门槛还升到了 99 元。
对于很多习惯在盒马买菜做饭的人来说, 99 元的凑单门槛能要了他们的命。。
大家实在想不通了,怎么大手大脚的阿里富哥儿,兜里好像突然没钱了。
如果我们看数据,会发现虽然盒马整体仍在亏损,但前年亏损已经在变少了。侯毅还在员工全员信中透露,其中盒马鲜生单个业务,前年甚至已经盈利。
按理来说,日子应该要慢慢好起来了,结果去年阿里一拆分,盒马独立了出来。
离开了大家庭之后,盒马的日子也开始紧巴起来了,如何盈利,成了当务之急。
所以,一整年时间,盒马都在做各种尝试。
 在 9 月份前,盒马想到的赚钱法子是把炮口对准山姆,去抢中产的钱。
先对标山姆推出了每年 658 元的钻石会员。还搞了一场轰轰烈烈的移山运动,正面比价、比货,打出半折的优惠。
最离谱的是跑到山姆门口,一车一车地往盒马运人。。。
虽然没伤到山姆分毫,但这招棋也算给盒马带来了不少好处。根据瑞泽洞察统计的数据,移山期间,盒马 APP 周均日活涨了 13.3% ,山姆也小涨了 3.9% 。
很多人以为,和山姆的这场贴身肉搏已经够猛的了。
结果没想到,移山结束才一个月,盒马又上新一系列大开大合的操作。
盒马干脆半放弃了自己的偏高价,重品质定位,打算用极致的低价硬刚到底。
去年 10 月,整了个全面 “ 折扣化 ” ,全场 5000 多款商品降价甩卖,之后连成本极高的生鲜价格都被打下来了。
随便举两个例子,以前卖 79 元的草莓盒子,现在只要 59 元、 39.9 的肥牛片降到了 31.9 。
面对一直居高不下的配送成本,盒马也选择重拳出击。
一位接近盒马的人士对知危表示,线上订单如果没到 99 元,对盒马来说送一单亏一单
 不巧的是,很多店铺的线上订单都能到 80 % 以上,有配送员算过,平均每单配送费都在六七元左右。每天平均 3000 单,一个盒马门店一个月就要支出五六十万。
估计是想止一波配送费的血,部分城市的盒马,便强制把运费门槛提高到了 99 元。
 但,这也让习惯了低运费门槛的消费者们,挨了一闷棍。
而且,除了提高免运费门槛,盒马还额外加设了线下特惠价,逼用户到店消费。甚至还有过线下价格,比线上会员价还便宜的情况,这也导致很多会员抱怨盒马不地道。
结果,盒马压根懒得安抚人心,直接挥刀把每年创收五亿多的会员制度全部砍了。
只能说,没人能阻止它,给来线下的家人们谋低价。
可能看到这,你会觉得有点奇怪。盒马不是说要赚钱吗?1 块钱的包装费都要抠搜,产品降价几十块,还有赚头吗?
因为盒马的砍一刀,不只砍在自己身上,也砍了背后的供应商们。
产品方面的降价,主要来自两块地方:一是自有品牌,二是供应商。
在自有品牌方面,盒马决定把占比在3 年内提高到 70% 。所以,我们稍微留心一点,就能发现货柜里的东西,不知道啥时候都印上盒马俩字了。
因为卖自有品牌很爽,利润很高,没有品牌商赚差价。卖多少钱,完全自己说了算。
除此之外,对那些供应商们,盒马也是下了狠手。
先是精简 SKU ( 库存量单位 ),下架 3000 多个产品。
另一方面,对供应商压价。根据茶叶品牌 Chabiubiu 创始人的爆料贴,盒马要他们降一半的价格。
侯毅公开地和供应商们说过: “ 希望你们一次性给我最低价。 ” 
只要愿意给低价,产品有竞争力,那就合作。如果不肯给,再大的牌子也不伺候。如此高压下,导致去年年末就有大量的品牌跳出来说,要跟盒马 “ 断交 ” 。
也难怪侯毅说,有人要封杀他们。如果我是供应商,已经想蹲他楼下,等着暴揍他了。
盒马也知道这样会得罪不少品牌,但没办法,拆分之后,盒马每一步,走的压力都很大。
去年 2 月,蔡崇信在阿里巴巴业绩会上说: “ 我们的资产负债表上依然有一些传统的实体零售业务,这些也不是我们的核心聚焦。如果能够完成退出的话,也是非常合理的。 ” 
 面对不断调整的阿里,盒马必须尽快完成它所谓的 “ 753  ” 大业即 KA ( 大客户 )商品是市场价的七折,自有品牌是市场价的五折,临期商品是市场价的三折
归根结底一句话,用便宜的价格来抢用户,扩规模。
但价格压得越低,那些供货稳定的大牌子,就更懒得陪盒马玩。全靠自营,现在的盒马能力又还不够格。
好在盒马现在在圈子里,还有点号召力。
曾经公开断供的王小卤,转头又和盒马牵上手了。盒马还顺便谈下了百世、玛氏。。。

也不可否认,盒马也依然拥有着一批相当忠实的用户,对很多人来说,盒马是更适合中国人体质的“ 山姆 ”。

他们烧钱烧出来的日鲜蔬菜、肉类、品质在线的甜点,以及快速的配送网络,对于大城市里不好去菜市场的人来说,确实是很方便。

反正差评君还记得,公司附近的盒马刚开业的时候,编辑部不少同事可都是翘班去实地考察的。用同事的原话来形容,第一次去盒马,甚至有种“ 楚雨荨第一次去美特斯邦威 ”的即视感。

当然玩笑归玩笑,盒马确实是不少人对新零售生鲜超市这个概念的启蒙。

但赔钱的生意终是做不长久,只能看盒马接下来,还会祭出什么样的牌吧。

撰文:四大  编辑:江江 & 面线 & 大饼  封面:焕妍

图片、资料来源

知危:盒马勒紧裤腰带:员工被转为临时工,有人含泪签协议、被暂缓IPO上市,但盒马不得不狂飙

chabiubiu:一位女性新消费创业者的艰难求生

第一财经“”盒马为什么得罪会员也要线上线下不同价

市界:盒马连砍了自己三刀

财新:盒马推折扣化变革 CEO侯毅决心告别KA模式

转自: https://mp.weixin.qq.com/s/u99dMf-odSpLqLH86zyOSw

6月15日—17日!2024年上海中考时间公布

2月29日,上海市教委公布《2024年本市高中阶段学校招生工作的若干意见》(以下简称《若干意见》),今年上海中考时间为6月15日-17日。


2024年上海市初中学业水平考试

时间安排


根据《若干意见》,本市高中阶段学校招生以初中学业水平考试(以下简称“学业考试”)语文、数学、外语、道德与法治、历史、体育与健身和综合测试(含物理、化学、跨学科案例分析、物理和化学实验操作)的成绩作为录取的基本依据,总分750分。


2024年学业考试全部安排在标准化考点进行,按照国家教育考试的标准和要求规范考务工作组织实施。回户籍地或居住证登记地址所在区参加中招报名(以下简称“跨区报名”)的学生,在学籍所在区参加学业考试。往届生、返沪生在报名所在区参加学业考试。残疾学生参加考试可申请相应合理便利。学业考试的语文、数学、英语、道德与法治和历史科目以及综合测试笔试实行全市统一网上评卷;其他科目考试评定工作由各区教育局组织实施。


2024年本市中招志愿填报统一在学业考试后、成绩发布前进行。各批次志愿在市级统一平台进行网上填报。学生须在规定时间内登录“上海招考热线”网站进行志愿填报。填报完成后,学生本人及家长(监护人)须进行志愿书面确认。


根据《实施意见》,今年上海高中阶段学校招生录取(以下简称“中招录取”)分三个批次进行,依次为自主招生录取、名额分配综合评价录取、统一招生录取。其中,自主招生录取在学业考试后进行,录取顺序依次为:市实验性示范性高中、市特色普通高中自主招生录取;市级优秀体育学生、艺术骨干学生自主招生录取;国际课程班和中外合作办学高中自主招生录取;中职校自主招生录取。名额分配综合评价录取工作在自主招生录取后进行。名额分配综合评价录取的总分由学业考试总成绩和综合素质评价成绩两部分构成,录取顺序依次为:“名额分配到区”录取;“名额分配到校”录取。统一招生录取工作中,“1至15志愿”招生录取由各区招考机构负责。各区招考机构根据学生学业考试总成绩和志愿,按平行志愿方式,从高分到低分进行录取。“1至15志愿”未被录取的学生,由各区招考机构负责进行征求志愿的填报和录取工作。


市教委要求,市、区招考机构以及各招生学校必须按《若干意见》中“2024年上海市高中阶段学校招生公布公示内容” 适时对外公布有关信息。各区招考机构网站要建立健全中招专栏,加强招生工作信息公开力度。


2024年上海市高中阶段学

招生日程表


文字:符佳

编辑:储咏瑜

* 转载请注明来自浦东发布官方微信


*直击引领区丨将人工智能嵌入全线业务,ABB发布新一轮AI战略

*守好船载危险货物审核关,浦东海事局全力维护辖区水上安全

转自: 浦东发布

从 Flask 切到 FastAPI 后,起飞了!

本文翻译自 Moving from Flask to FastAPI, 作者:Amal Shaji

刚好笔者这几天上手体验 FastAPI,感受到这个框架易用和方便。之前也使用过 Python 中的 Django 和 Flask 作为项目的框架。Django 说实话上手也方便,但是学习起来有点重量级框架的感觉,FastAPI 带给我的直观体验还是很轻便的,本文翻译的这篇文章就会着重介绍 FastAPI 和 Flask 的区别。

Python 是最流行的编程语言之一。从脚本到 API 开发再到机器学习,Python 都有着它自己的足迹。因为 Python 注重开发者的体验和其所能提供的大量工具而大受欢迎。网络框架 Flask 就是这样一个工具,它在机器学习社区中很受欢迎。它也被广泛用于 API开发。但是有一个新的框架正在崛起: FastAPI。与 Flask 不同,FastAPI 是一个 ASGI(Asynchronous Server Gateway Interface 异步服务器网关接口)框架。与 Go 和 NodeJS 一样,FastAPI 是最快的基于 Python 的 Web 框架之一。

本文针对那些有兴趣从 Flask 转移到 FastAPI 的人,比较和对比了 Flask 和 FastAPI 的常见模式。

# FastAPI vs Flask

FastAPI 的构建考虑了以下三个主要问题:

  • 速度
  • 开发者经验
  • 开放标准

你可以把 FastAPI 看作是把 Starlette、Pydantic、OpenAPI 和 JSON Schema 粘合在一起的胶水。

  • 本质上说,FastAPI 使用 Pydantic 进行数据验证,并使用 Starlette 作为工具,使其与 Flask 相比快得惊人,具有与 Node 或 Go 中的高速 Web APIs 相同的性能。
  • Starlette + Uvicorn 提供异步请求能力,这是 Flask 所缺乏的。
  • 有了 Pydantic 以及类型提示,你就可以得到一个具有自动完成功能的良好的编辑体验。你还可以得到数据验证、序列化和反序列化(用于构建一个 API),以及自动化文档(通过 JSON Schema 和 OpenAPI )。

也就是说,Flask 的使用更为广泛,所以它经过了实战检验,并且有更大的社区支持它。由于这两个框架都是用来扩展的,Flask 显然是赢家,因为它有庞大的插件生态系统。

建议:

  • 如果你对上述三个问题有共鸣,厌倦了 Flask 扩展时的大量选择,希望利用异步请求,或者只是想建立一个 RESTful API,请使用 FastAPI。
  • 如果你对 FastAPI 的成熟度不满意,需要用服务器端模板构建一个全栈应用,或者离不开一些社区维护的 Flask 扩展,就可以使用 Flask。

# 开始

 安装

与任何其他 Python 包一样,安装非常简单。

Flask

pip install flask

# or
poetry add flask
pipenv install flask
conda install flask

FastAPI

pip install fastapi uvicorn

# or
poetry add fastapi uvicorn
pipenv install fastapi uvicorn
conda install fastapi uvicorn -c conda-forge

与 Flask 不同,FastAPI 没有内置的开发服务器,因此需要像 Uvicorn 或 Daphne 这样的 ASGI 服务器。

 “Hello World” 应用

Flask

# flask_code.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return {"Hello""World"}

if __name__ == "__main__":
    app.run()

FastAPI

# fastapi_code.py

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def home():
    return {"Hello""World"}

if __name__ == "__main__":
    uvicorn.run("fastapi_code:app")

reload=True 这样的参数可以被传递到 uvicorn.run() 中,以实现开发时的热重载。

或者,您可以直接从终端启动服务器:

uvicorn run fastapi_code:app

热加载模式:

uvicorn run fastapi_code:app --reload

# 配置

Flask 和 FastAPI 都提供了许多选项来处理不同环境的不同配置。两者都支持以下模式:

  1. 环境变量
  2. 配置文件
  3. 实例文件夹
  4. 类和继承

有关更多信息,请参阅其各自的文档:

  • Flask: https://flask.palletsprojects.com/en/2.0.x/config/
  • FastAPI:https://fastapi.tiangolo.com/advanced/settings/

Flask

import os
from flask import Flask

class Config(object):
    MESSAGE = os.environ.get("MESSAGE")

app = Flask(__name__)
app.config.from_object(Config)

@app.route("/settings")
def get_settings():
    return { "message": app.config["MESSAGE"] }

if __name__ == "__main__":
    app.run()

现在,在你运行服务器之前,设置适当的环境变量:

export MESSAGE="hello, world"

FastAPI

import uvicorn
from fastapi import FastAPI
from pydantic import BaseSettings

class Settings(BaseSettings):
    message: str

settings = Settings()
app = FastAPI()

@app.get("/settings")
def get_settings():
    return { "message": settings.message }

if __name__ == "__main__":
    uvicorn.run("fastapi_code:app")

同样,在运行服务器之前,设置适当的环境变量:

export MESSAGE="hello, world"

# 路由, 模板和视图

 HTTP 方法

Flask

from flask import request

@app.route("/", methods=["GET", "POST"])
def home():
    # handle POST
    if request.method == "POST":
        return {"Hello""POST"}
    # handle GET
    return {"Hello""GET"}

FastAPI

@app.get("/")
def home():
    return {"Hello""GET"}

@app.post("/")
def home_post():
    return {"Hello""POST"}

FastAPI 为每个方法提供单独的装饰器:

@app.get("/")
@app.post("/")
@app.delete("/")
@app.patch("/")

 URL 参数

通过 URL(如 /employee/1 )传递信息以管理状态:

Flask

@app.route("/employee/<int:id>")
def home():
    return {"id": id}

FastAPI

@app.get("/employee/{id}")
def home(id: int):
    return {"id": id}

URL参数的指定类似于一个 f-string 表达式。此外,你还可以利用类型提示。这里,我们在运行时告诉 Pydantic, idint 类型的。在开发中,这也可以帮助完成更好的代码完成度。

 查询参数

与 URL 参数一样,查询参数(如 /employee?department=sales )也可用于管理状态(通常用于过滤或排序):

Flask

from flask import request

@app.route("/employee")
def home():
    department = request.args.get("department")
    return {"department": department}

FastAPI

@app.get("/employee")
def home(department: str):
    return {"department": department}

 模板

Flask

from flask import render_template

@app.route("/")
def home():
    return render_template("index.html")

默认情况下,Flask会在 “templates “文件夹中寻找模板。

FastAPI

你需要安装 Jinja:

pip install jinja2

实现:

from fastapi import Request
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse

app = FastAPI()

templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)
def home(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

对于 FastAPI,你需要明确地定义 “模板 “文件夹。然后对于每个响应,需要提供请求上下文。

 静态文件

Flask

默认情况下,Flask 从“static”文件夹中提供静态文件。

FastAPI

在 FastAPI 中,需要为静态文件挂载一个文件夹:

from fastapi.staticfiles import StaticFiles

app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")

 异步任务

Flask

从 Flask 2.0 开始,您可以使用 async/await 创建异步路由处理程序:

@app.route("/")
async def home():
    result = await some_async_task()
    return result

有关 Flask 中异步视图的更多信息,请查看 Flask 2.0 中的异步一文。

Flask 中的异步也可以通过使用线程(并发)或多处理(并行)或 Celery 或 RQ 等工具来实现:

  1. Asynchronous Tasks with Flask and Celery:https://testdriven.io/blog/flask-and-celery/
  2. Asynchronous Tasks with Flask and Redis Queue:https://testdriven.io/blog/asynchronous-tasks-with-flask-and-redis-queue/

FastAPI

由于 FastAPI 对 asyncio 的原生支持,它极大地简化了异步任务。要使用的话,只需在视图函数中添加 async 关键字:

@app.get("/")
async def home():
    result = await some_async_task()
    return result

FastAPI 还具有后台任务功能,您可以使用它来定义返回响应后要运行的后台任务。这对于不需要在发送回响应之前完成的操作很有用。

from fastapi import BackgroundTasks

def process_file(filename: str):
    # process file :: takes minimum 3 secs (just an example)
    pass

@app.post("/upload/{filename}")
async def upload_and_process(filename: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(process_file, filename)
    return {"message""processing file"}

在这里,响应将被即时发送,而不会让用户等待文件处理完成。

当你需要进行繁重的后台计算时,或者你需要一个任务队列来管理任务(tasks)和工作者(workers)时,你可能想使用Celery 而不是 BackgroundTasks。更多内容请参考 FastAPI 和 Celery 的异步任务:https://testdriven.io/blog/fastapi-and-celery/

 依赖注入

Flask

虽然你可以实现自己的依赖注入解决方案,但 Flask 默认没有真正的一流支持。相反,你需要使用一个外部包,如 flask-injector。

FastAPI

另一方面,FastAPI 具有处理依赖注入的强大解决方案。

例如:

from databases import Database
from fastapi import Depends
from starlette.requests import Request

from db_helpers import get_all_data
def get_db(request: Request):
    return request.app.state._db

@app.get("/data")
def get_data(db: Database = Depends(get_db)):
    return get_all_data(db)

因此,get_db 将获取对在应用程序的启动事件处理程序中创建的数据库连接的引用。 Depends 然后用于向 FastAPI 指示路由“依赖于” get_db。因此,它应该在路由处理程序中的代码之前执行,并且结果应该“注入”到路由本身。

 数据校验

Flask

Flask 没有任何内部数据验证支持。您可以使用功能强大的 Pydantic 包通过 Flask-Pydantic 进行数据验证。

FastAPI

FastAPI 如此强大的原因之一是它支持 Pydantic。

from pydantic import BaseModel

app = FastAPI()

class Request(BaseModel):
    username: str
    password: str

@app.post("/login")
async def login(req: Request):
    if req.username == "testdriven.io" and req.password == "testdriven.io":
        return {"message""success"}
    return {"message""Authentication Failed"}

在这里,我们接受一个模型 Request 的输入。该 payload 必须包含一个用户名和密码。

# correct payload format
✗ curl -X POST 'localhost:8000/login' 
    --header 'Content-Type: application/json' 
    --data-raw '{"username": "testdriven.io","password":"testdriven.io"}'

{"message":"success"}

# incorrect payload format
✗ curl -X POST 'localhost:8000/login' 
    --header 'Content-Type: application/json' 
    --data-raw '{"username": "testdriven.io","passwords":"testdriven.io"}'

{"detail":[{"loc":["body","password"],"msg":"field required","type":"value_error.missing"}]}

注意到这个请求。我们把密码 passwords 作为一个键而不是 password 传递进去。Pydantic 模型会自动告诉用户,password 字段是缺失的。

 序列化和反序列化

Flask

最简单的序列化方法是使用 jsonify:

from flask import jsonify
from data import get_data_as_dict

@app.route("/")
def send_data():
    return jsonify(get_data_as_dict)

对于复杂的对象,Flask 开发者经常使用 Flask-Marshmallow

FastAPI

FastAPI 自动序列化任何返回的字典 dict 。对于更复杂和结构化的数据,使用 Pydantic:

from pydantic import BaseModel

app = FastAPI()

class Request(BaseModel):
    username: str
    email: str
    password: str

class Response(BaseModel):
    username: str
    email: str

@app.post("/login", response_model=Response)
async def login(req: Request):
    if req.username == "testdriven.io" and req.password == "testdriven.io":
        return req
    return {"message""Authentication Failed"}

在这里,我们添加了一个包含三个输入的 Request 模型:用户名、电子邮件和密码。我们还定义了一个仅包含用户名和电子邮件的 Response 模型。输入 Request 模型处理反序列化,而输出 Response 模型处理对象序列化。然后通过 response_model 参数将响应模型传递给装饰器。

现在,如果我们将请求本身作为响应返回,Pydantic 将省略 password ,因为我们定义的响应模型不包含密码字段。

例如:

# output
✗ curl -X POST 'localhost:8000/login' 
    --header 'Content-Type: application/json' 
    --data-raw '{"username":"testdriven.io","email":"admin@testdriven.io","password":"testdriven.io"}'

{"username":"testdriven.io","email":"admin@testdriven.io"}

 中间件

中间件被用来在每个请求被视图功能处理之前应用逻辑。

Flask

class middleware:
    def __init__(self, app) -> None:
        self.app = app

    def __call__(self, environ, start_response):
        start = time.time()
        response = self.app(environ, start_response)
        end = time.time() - start
        print(f"request processed in {end} s")
        return response

app = Flask(__name__)
app.wsgi_app = middleware(app.wsgi_app)

FastAPI

from fastapi import Request

@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    print(f"request processed in {process_time} s")
    return response

@app.middleware("http") 装饰器是在 FastAPI 中创建中间件的必备工具。上述中间件计算处理请求所花费的时间。视图函数处理请求后,计算总处理时间并将其作为响应头返回。

# flask output(logs)
request processed in 0.0010077953338623047 s
127.0.0.1 - - [22/Sep/2020 18:56:21"GET / HTTP/1.1" 200 -

# fastapi output(logs)
request processed in 0.0009925365447998047 s
INFO:     127.0.0.1:51123 - "GET / HTTP/1.1" 200 OK

 模块化

随着应用程序的发展,在某些时候你会想把类似的视图、模板、静态文件和模型组合在一起,以帮助把应用程序分解成更小的组件。

Flask

在 Flask 中,蓝图被用来实现模块化:

# blueprints/product/views.py
from flask import Blueprint

product = Blueprint("product", __name__)

@product.route("/product1")
    ...
# main.py

from blueprints.product.views import product

app.register_blueprint(product)

FastAPI

同时,在 FastAPI 中,模块化是通过 APIRouter 实现的:

# routers/product/views.py
from fastapi import APIRouter

product = APIRouter()

@product.get("/product1")
    ...
# main.py

from routers.product.views import product

app.include_router(product)

# 其他特点

 自动文档

Flask

Flask 不会自动创建开箱即用的 API 文档。然而,有几个扩展可以处理这个问题,比如 flask-swagger 和 Flask RESTX,但它们需要额外的设置。

FastAPI

默认情况下,FastAPI 支持 OpenAPI 以及 Swagger UI 和 ReDoc。这意味着每个端点都自动从与端点关联的元数据中记录下来。

所有注册的端点都列在这里

此处列出了所有已注册的端点

替代文档

 管理应用

Flask

Flask 有一个广泛使用的第三方管理包,称为 Flask-Admin,用于快速对您的模型执行 CRUD 操作。

FastAPI

截至目前,有两个流行的 FastAPI 扩展用于此:

  1. FastAPI Admin – 功能性管理面板,提供用于对数据执行 CRUD 操作的用户界面。
  2. SQLAlchemy Admin -FastAPI/Starlette 的管理面板,可与 SQLAlchemy 模型一起使用。

 身份认证

Flask

虽然 Flask 没有原生解决方案,但可以使用多个第三方扩展。

FastAPI

FastAPI 通过 fastapi.security 包原生支持许多安全和身份验证工具。通过几行代码,您可以将基本的 HTTP 身份验证添加到您的应用程序中:

import secrets

from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials

app = FastAPI()

security = HTTPBasic()


def get_current_username(credentials: HTTPBasicCredentials = Depends(security)):
    correct_username = secrets.compare_digest(credentials.username, "stanleyjobson")
    correct_password = secrets.compare_digest(credentials.password, "swordfish")
    if not (correct_username and correct_password):
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
    return credentials.username


@app.get("/whoami")
def who_ami_i(username: str = Depends(get_current_username)):
    return {"username": username}

FastAPI 通过 OpenAPI 标准实现 OAuth2 和 OpenID Connect。

查看官方文档中的以下资源以获取更多信息:

  1. Security Intro:https://fastapi.tiangolo.com/tutorial/security/
  2. Advanced Security:https://fastapi.tiangolo.com/advanced/security/

其他资源

  1. Web Authentication Methods Compared:https://testdriven.io/blog/web-authentication-methods/
  2. Adding Social Authentication to Flask:https://testdriven.io/blog/flask-social-auth/
  3. Session-based Auth with Flask for Single Page Apps:https://testdriven.io/blog/flask-spa-auth/
  4. Securing FastAPI with JWT Token-based Authentication:https://testdriven.io/blog/fastapi-jwt-auth/

 CORS

CORS(跨源资源共享)中间件检查请求是否来自允许的来源。如果是,则将请求传递给下一个中间件或视图函数。如果不是,它会拒绝请求,并将错误响应发送回调用者。

Flask Flask 需要一个名为 Flask-CORS 的外部包来支持 CORS:

pip install flask-cors

基本实现:

from flask_cors import CORS

app = Flask(__name__)

CORS(app)

FastAPI

FastAPI 原生支持 CORS:

from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = ["*"]

app.add_middleware(CORSMiddleware, allow_origins=origins)

# 测试

Flask

import pytest
from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return {"message""OK"}

def test_hello():
    res = app.test_client().get("/")

    assert res.status_code == 200
    assert res.data == b'{"message":"OK"}n'

FastAPI

from fastapi import FastAPI
from fastapi.testclient import TestClient

app = FastAPI()

@app.get("/")
async def home():
    return {"message""OK"}

client = TestClient(app)

def test_home():
    res = client.get("/")

    assert res.status_code == 200
    assert res.json() == {"message""OK"}

FastAPI 提供了一个 TestClient。有了它,你可以直接用 FastAPI 运行 pytest。有关更多信息,请查看官方文档中的测试指南。

# 部署

 生产服务器

Flask

Flask 默认运行开发 WSGI(Web 服务器网关接口)应用程序服务器。对于生产环境,您需要使用生产级 WSGI 应用服务器,例如 Gunicorn、uWSGI 或 mod_wsgi

安装 Gunicorn:

pip install gunicorn

启动服务:

# main.py
# app = Flask(__name__)

gunicorn main:app

FastAPI

由于 FastAPI 没有开发服务器,您将使用 Uvicorn(或 Daphne)进行开发和生产。

安装 Uvicorn:

pip install uvicorn

启动服务:

python
# main.py
# app = FastAPI()

uvicorn main:app

您可能希望使用 Gunicorn 来管理 Uvicorn,以便同时利用并发性(通过 Uvicorn)和并行性(通过 Gunicorn worker):

# main.py
# app = FastAPI()

gunicorn -w 3 -k uvicorn.workers.UvicornWorker main:app

 Docker

Flask

FROM python3.10-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["gunicorn""main:app"]

这是 Flask 最简单的 Dockerfile 之一。要了解如何针对生产对其进行全面配置,请查看使用 Postgres、Gunicorn 和 Nginx 教程对 Flask 进行 Docker 化。

FastAPI

sql
FROM python3.10-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["uvicorn""main:app"]

同样,这是一个非常简单的配置。 FastAPI 作者提供了几个生产就绪的 Dockerfile。有关更多信息,请查看官方 FastAPI 文档以及 Dockerizing FastAPI with Postgres、Uvicorn 和 Traefik 教程。

# 总结

退一步讲,Django 和 Flask 是两个最流行的基于 Python 的网络框架(FastAPI 是第三大流行框架)。不过它们(Django 和 Flask)的理念非常不同。Flask 比 Django 的优势在于 Flask 是一个微框架。程序结构由程序员自己决定,不强制执行。开发者可以在他们认为合适的时候添加第三方扩展来改进他们的代码。也就是说,通常情况下,随着代码库的增长,需要一些几乎所有网络应用都需要的通用功能。这些功能与框架的紧密结合,使得终端开发者需要自己创建和维护的代码大大减少。

本文中的代码实例也表达了同样的意思。换句话说,FastAPI 包括许多必要的功能。它还遵循严格的标准,使你的代码可以生产并更容易维护。FastAPI 的文档也非常完善。

虽然 FastAPI 可能不像 Flask 那样久经考验,但越来越多的开发人员正在转向它来提供机器学习模型或开发 RESTful API。切换到 FastAPI 是一个不错的选择。

# 官方文档

  • FastAPI:https://fastapi.tiangolo.com/
  • Flask:https://flask.palletsprojects.com/en/2.0.x/

# 其他资源

  • Porting Flask to FastAPI for ML Model Serving:https://www.pluralsight.com/tech-blog/porting-flask-to-fastapi-for-ml-model-serving/
  • Why we switched from Flask to FastAPI for production machine learning:https://towardsdatascience.com/why-we-switched-from-flask-to-fastapi-for-production-machine-learning-765aab9b3679
  • Awesome Flask:https://github.com/mjhea0/awesome-flask
  • Awesome FastAPI:https://github.com/mjhea0/awesome-fastapi

作者:宇宙之一粟
链接:https://juejin.cn/post/7219225476706140218

为什么宗庆后是中国本土企业家的极致代表

  凤凰网原创  宗庆后幸运地搭上了时代的列车进入了头等舱。悼念宗庆后,当然不是因为他能进入头等舱,而是希望中国这列火车,在更加理性、包容、公平的市场经济环境中,继续保持快车道。

作者|刘远举
财经专栏作家、多家智库研究员
2月25日,娃哈哈官方微博发布讣告,娃哈哈集团创始人、董事长宗庆后,因病医治无效逝世,享年79岁。这个消息并不突然,早在此前几天,就陆续传出宗庆后因肺癌进入ICU的消息。
盖棺未必定论,但商业成就是清晰的。现在杭州娃哈哈集团有限公司是国内领军型饮料企业,位居中国企业500强、中国制造业500强、中国民企500强前列,是中国最具影响力的民营企业之一。宗庆后本人,也曾三次问鼎中国首富。
从另一个角度,宗庆后也做到了当下一个中国民营企业家的极致。
在娃哈哈官方微博发布的落款却是治丧委员会的讣告中,宗庆后拥有一系列荣耀的头衔:中国共产党党员,全国劳动模范,全国五一劳动奖章获得者,优秀中国特色社会主义事业建设者,改革开放40年百名杰出民营企业家,第十、十一、十二届全国人大代表,中国共产党浙江省第十二、十三、十四届代表大会代表。最后,才是娃哈哈集团创始人、董事长。

原始积累:超越时代的敏锐
1945年出生的宗庆后,用现在的话说,他人生一开始就拿到了一手烂牌。因为父亲是南京政府职员,这种伪职员的阶级成分,让他无法报考师范学校。此后他辍学,开始自谋生路,在杭州走街串巷卖爆炒米和煮红薯。
年轻人的就业不好了,那就去广大天地接受贫下中农的再教育。1963年,没有多少知识的宗庆后,18岁时也成了知识青年,开始“上山下乡”。他先去了农场,挖沟修坝、拉土堆石,又去了茶场,种茶、插秧、养猪、杀猪。
就这样一晃15年,他度过了,或者说荒废了,自己的青春和青年时期。如果老套的写法,在这里一定会加上:吃苦磨炼人——在这段时期,他积累了自己最宝贵的财富——苦难,甚至宗庆后自己也会这么说。但无论如何,他和任何一个人,都不会希望自己的子女再吃15年这样的苦,也不会希望中国再出现这样的弯路。
在1978年,各种新气象暗流涌动,不时突破水面,一个小小的水泡在水面上破裂开来,形成一圈一圈的涟漪。云南五万知青,惊天一跪请愿,引发云南知青大返城事件。远在西南边陲的水泡,也影响到一个浙江青年;时代机器中的个人命运的小小齿轮,也开始旋转。就在这一年,33岁的宗庆后回杭州,顶替母亲在校办工厂做供销员。
1986年,农村早已施行很久的承包制度,开始进入到城市,进入到工业,开始“推行多种形式的经营承包责任制,给经营者以充分的经营自主权”。这十年间,宗庆后一直主要干的是供销员,人做自己擅长的事,就会顺风顺水。顺着这股子劲头,1987年,宗庆后借来14万元,承包了连年亏损的校办企业经销部,开始了自己的创业人生。
这一年,宗庆后已经41岁了。但他人生的青春,才刚刚拉开序幕。
其实,那还是一个乍暖还寒的年代。就在这一年,著名的傻子瓜子年广九被立案审查,雇工8人算不算剥削,还是那时的时代热议。比起现在B站上的“你工人阶级爷爷来了”“民营经济应该离场”,有过之而无不及。
现在再也没人回到这样一个问题:当年的宗庆后,到底是以中国第一代企业家对政策的敏感性和精确预测,还是以中国底层老百姓的无知而无畏,让他敢于逆势而上,在严峻的民营经济形势中,开始自己的创业。不过,这并不重要了,时代就是这样,用无数人的人生作为自己的铺路石。不同的是,有些石头,最后会发出宝石的光芒,在道路上熠熠生辉,为时代照亮前路。
初富的中国人,在鸡鸭鱼肉之外,开始追求健康,各种口服液层出不穷。宗庆后最初代理了一款“中国花粉口服液”,后来又为其做代工。发现这个市场利润丰厚后,1988年在浙江大学医学营养系主任朱寿民教授的帮助下,宗庆后开发出自己的第一个产品——娃哈哈儿童营养液,创立了杭州娃哈哈营养食品厂。其实,现在来看,成分无非是补锌、补铁,加点中药,要说有实质性效果,其实未必有多少。

宗庆后是懂消费者焦虑的。就在产品即将面世之际,宗庆后却又委托科研机构对3006名小学生进行了一次调查。结果发现,有1336名小学生患有程度不同的营养不良症:缺锌、缺钙、缺铁等营养元素的,竟占到了44.4%。在当时,这是奇怪的,是在花冤枉钱。但在现在看来,其实是基本操作了——用权威机构自带传播的数据,直击焦虑,为产品造势。
对于那时来说,却针对了时代痛点。富裕起来的中国人,希望自己孩子吃得越多越好。而独生子女政策的实施,又形成了一代“小皇帝”。娃哈哈口服液,满足了让小皇帝吃饭的心理焦虑。“喝了娃哈哈,吃饭就是香”的直白广告语,直击家长心智。娃哈哈营养液迅速打开了市场。3年销售过亿,公司完成了初步的原始积累。
这种超越时代的敏锐,一直伴随娃哈哈的整个发展过程。

合资与改制:恩怨背后的中西之争
1994年,娃哈哈积极响应国务院对口支援三峡库区移民工作的号召,投身西部开发,以“移民任务与移民经费总承包”的思路,兼并了涪陵地区受淹的3家特困企业,建立娃哈哈第一家省外分公司涪陵公司。在响应号召的过程中,娃哈哈完成了扩张。
在急速的发展中,娃哈哈集团开始遇到资金、技术的两重障碍。90年代末期,全球化浪潮初现,各国优势商业要素开始在全球范围内配置。这个时候,娃哈哈遇到了急于在中国发展的达能。达能集团,来头不小:1989年时,已经是成为世界第六大、欧洲第三大食品集团,旗下拥有依云、多美滋等多个国际一线品牌。
达能看重娃哈哈的渠道,娃哈哈需要达能的资金和技术,双方一拍即合。1996年,达能联合香港百富勤共同出资4500万美元,与娃哈哈成立了5家合资公司。
意外,商业社会的毫不意外。1997年,亚洲金融风暴来袭,香港百富勤将新加坡金加投资公司30%的股份卖给达能集团。此时,“达娃”合资公司的股权结构变更为达能集团持股51%、娃哈哈集团持股39%、美食城持股10%。合作的天平,已经开始失衡。
虽然祸端已经埋下,但任何婚姻一开始都是喜乐的。“达娃”合资公司先后从美国、德国、日本、意大利、加拿大等发达国家引进了大量的国际先进生产技术,完成了对生产线的升级改造,借势提升了品牌实力,娃哈哈集团再次步入高速发展的快车道。
1998年5月,娃哈哈推出碳酸饮料“非常可乐”,意在挑战可口可乐和百事可乐,凭借的是渠道的优势。2003年5月“非典”疫情结束后,宗庆后抢在竞争对手之前,将大批饮料送到零售终端,使销售实现了16%的年增长,公司营业收入突破100亿元大关。
对宗庆后而言,一边是合资,另一边是改制;合资关乎发展,而改制关系到身家性命。在2000年的改制中,宗及员工从政府手中买回了娃哈哈集团55%的股份,娃哈哈实现“全员持股”。其中,宗庆后占股30%,高级管理层5%,员工20%。近46%的股份,由杭州市上城区国有资产管理有限公司拥有。相对清晰的股权渊源,能让宗庆后在后来能够坐看风云。
2006年4月,达能与娃哈哈矛盾公开化。“达娃之争”,被称为改革开放30年来影响最大的国际商战,诉讼长达三年、遍及全球,还涉及到宗庆后家人。

在中国领导人和法国总统萨科齐的干预下,以更高层面看待此事,达能和娃哈哈发布联合公告,双方同意结和解。最终,2009年9月30日,达能与娃哈哈“友好分手”,终止合资关系,达能将其在各家合资公司中51%的股权出售给娃哈哈,作价3亿欧元,大大低于达能最早提出的12亿欧元。
关于这场争执的解释,至今仍然有众说纷纭。有人说是娃哈哈缺乏契约意识,也有人说达能搞双重标准。这很正常,合同条约、具体情况,各有理解,利益争执中自然是各执一词。
这些原因中,对中国社会的不同看法,以及因之而产生的战略分歧,当是一个很重要的原因。娃哈哈集团希望通过参与西部大开发、对口支援革命老区、国家贫困区等项目建设,完善企业在全国的战略布局,在提升产能的同时树立良好的企业形象。但达能集团予以拒绝,认为这些地区消费潜力低,预期投资回报差。
1999年,宗庆后继续西进北上,决定由职工集资持股成立的公司出面,建立一批与达能没有关系的公司。到2006年,总资产达56亿元,当年利润10.4亿元。这也成为达能指控宗庆后损害合资公司利益的证据。
宗庆后与外国企业家的战略差异,背后是对中国社会的深刻认识与娴熟适应。他曾回顾说:“合资之后,达能曾向娃哈哈派驻了一个搞市场策划的、一个搞技术的,都被我赶走了。因为我觉得他们完全不懂中国市场。”这意味着,某种程度上,和平分手,已经是达能能得到的最好的,或许也是唯一的解决方案。
1996年2月29日,杭州娃哈哈公司与达能签署《商标转让协议》,将“娃哈哈”商标转让给达娃合资公司,但当时国家商标局对此未予核准。此后,达娃公司以《商标使用许可合同》为凭使用娃哈哈商标。国家商标局阻拦在此后的纷争中,救下了娃哈哈。多年之后,当另一位杭州人也因为监管被诟病没有契约意识时,他或许会想到当年的这一幕。
回顾宗庆后的一生,大致上会认为他是一个制造业企业家,这种认知大致上是对的。也正因为是制造业、实体经济企业家,宗庆后在反资本的民间大潮中,能够免于资本家的指控。

哀悼之外:希望时代列车继续保持快车道
不过,仅仅从制造来认识宗庆后是不全面的。
由于长期历史传统和计划经济经历,中国人对工业、经济发展的理解,停留在“造出东西”。造出东西,才是经济发展,才是实体经济。但宗庆后的娃哈哈纯净水,可以告诉人们,市场经济并非简单地“造出东西”。
某种程度上,娃哈哈纯净水的故事,才是宗庆后真正的底色。
现在很多科研实验,都用娃哈哈当做纯水来源,并在论文中标出来,所以现在的论文数据库中,能搜索到大量的娃哈哈。并不是所有的纯水,都能达到这种程度。把一个产品做到如此程度,需要作为企业家的宗庆后,依靠市场,去调动资源,在每个环节,从灌装线、到瓶子、瓶盖,从物流到营销,都做到极致,精益求精。这背后是企业家的殚精竭虑,是多年的坚守和努力。
这当中,制造本身纵然是基础,但营销、市场不可或缺,甚至更为重要。宗庆后靠的是自己独创的“宗氏联销体模式”,即代理商交纳一定金额的保证金,承诺一定数量的年度销量。作为回报,厂商把该区域的商品代理权交给该经销商,并且支付超出银行“数倍”的保证金利息,将娃哈哈的自身利益与经销商的利益捆绑在一起。通过这种像毛细血管一样深入全国各地的销售网络,娃哈哈的产品深入中国大街小巷,公司新品一周内铺遍全国。
正是在强大的制造的基础上,再加上这个网络,宗庆后才能让一瓶娃哈哈纯净水,质量高而稳定,却又价格低廉。资深媒体人秦朔曾评价:“在打造市场方面,宗庆后代表了中国本土企业家的最高成就,他运作快消品的眼光、推广和营销能力更是经典。”
2005年,娃哈哈推出“营养快线”。仅仅一年时间,营养快线就实现了400%以上的增长,销售收入26个亿。显然,这个业绩,离不开这个销售网络。
从这个意义上讲,宗庆后一辈子所做的,并不是计划经济意义下的制造业,而是市场经济意义下的制造业。

2023年12月,已经停办了三年的娃哈哈全国销售工作会议再次举办。上万名经销商,涌进杭州的运河公园体育馆。这场大会上,宗馥莉发表讲话、部署战略,已经接替了父亲往日的角色。后继有人,宗老先生也可没有牵挂。
但,没有近虑就或有远忧。宗庆后最被诟病的,是他的“专制”“独裁”。对此,他并不否认。他曾坦然表示:娃哈哈的企业文化是“家文化”,忠诚和团结是基本的道德要求。这当然会对企业造成一定的损害。
曾经成功的非常可乐,终究是没落了。2002年5月,娃哈哈曾投资数亿元打造童装品牌,后来宗庆后也承认决策失误。
在2014年一场峰会上,宗庆后公开批评电子商务对实体经济产生了负面影响,曾引起非议。但2017年,与阿里巴巴牵手共同推出了共享服务信用亭,在2018年12月上线“哈宝游乐园”试水社交电商,2019年后进一步在抖音、微信、微博等平台进行产品推广。2020年3月24日,杭州娃哈哈电子商务有限公司成立;4月2日,娃哈哈宏振跨境电子商务有限公司成立。这些努力,都悄无声息。
更重要的是,在00后整顿职场的今天,在市场瞬息万变的今天,“家文化”能否适应今后的时代,这需要后继者去回答。
宗庆后的一生,有着浓郁的时代色彩,也是那一代人的缩影,当然,更浓烈,更耀眼。他是一个超越时代的人,同时,又是一个善于适应时代的人。某种程度上,这是中国诸多成功企业家的共同特质。宗庆后生于苦难之中,又幸运地搭上了时代的列车,通过自身努力进入了头等舱。
我们悼念宗庆后,当然不是因为他能进入头等舱,而是希望中国这列火车,在更加理性、包容、公平的市场经济环境中,继续保持快车道。

本文系凤凰网评论部特约原创稿件,仅代表作者立场。

主编|萧轶‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

转自: 风声OPINION https://mp.weixin.qq.com/s/a5HaMkRaTPmavWjiZAJeeA

马云写给宗庆后的挽联,意味深长!

作者 | 燕大

昨天上午10时30分,娃哈哈集团创始人、董事长宗庆后逝世。
在过去的20年内,宗庆后曾3次问鼎《福布斯》中国内地富豪榜榜首,现中国首富、农夫山泉创始人钟睒睒还曾是娃哈哈省级代理商。
在马云最火时,同为浙商的宗庆后毫不留情地批评说:除了新技术,其他都是胡说八道。他本身不是从事实体经济的,能制造什么东西?
但宗庆后去世后,马云还是感到非常痛惜,亲自写下一副挽联,足见马云之人品和格局:
人生搏击四十不晚,开拓者精神;创业千难夙夜求新,企业家本色。
01
60年代开始十几岁的宗庆后就在盐场挖盐晒盐挑盐,几乎啥苦力活都干过,1978年在杭州做教师的母亲退休,33岁的宗庆后回到杭州接班,在校办纸箱厂做推销员。
命运的齿轮开始转动,就是从这个推销员为起点。之后多次辗转一直干各种销售管理岗,一路干到杭州上城区校办企业的销售经理。
不论在哪个时代,能把一副烂牌打成这样都算得上是优秀。
1987年当地文教局要对下属校办企业经销部采用承包经营方式,公开选拔经销部负责人,彼时宗已经42岁,但应该与其常年干销售与人打交道有关,宗庆后毛遂自荐夸下当年创利10万元的海口,而当时文教局的要求仅为4万。
之后宗老板带着两个退休教师,承包下连年亏损的校办经销部,经常蹬着三轮车给学校送货,靠代销汽水冰棒和文具纸张起家。
那时候还没搞市场经济,也没啥人主动做生意,宗庆后第一年承包就完成了10万块利润。
第二年他与一家保健品公司合作,创立一个罐头车间,给保健品公司代加工罐装营养口服液。帮别人卖东西不如自己干,借钱也得干,接着宗就在经销部基础上设立娃哈哈营养食品厂,推出娃哈哈营养液。
1988年“喝了娃哈哈,吃饭就是香”的广告响彻大江南北,娃哈哈儿童营养液一炮而红。
那时候物资缺乏,娃哈哈出名之后,跑销售的拿蛇皮袋扛着现金到厂子门口抢货,就跟《鸡毛飞上天》里演绎的一模一样,甚至把宗老板批的条子当成指标倒卖。
到了1991年,三年时间娃哈哈产能扩大了60倍,利润暴涨了100倍,但还是远远不够,急需扩大产能,后面两名记者对娃哈哈的调研长篇报道发到内参,甚至被高层注意到,这就给了宗庆后完成第一次大跨越的机会——兼并,且是小鱼吞大鱼。
在当时资与社争论的背景下,只有100多名员工的民企娃哈哈兼并拥有2000多名职工、一百多亩地的厂区、超过6万平方米的厂房的国企杭州罐头食品厂。
民营小鱼吞并国有大鱼,创造了时代奇迹。彼时遍地黄金一样的市场,这一步直接实现做大做强再创辉煌。
02
但饮品行业是重资产、回款慢,同时又要大量扩张生产线,娃哈哈的资金上就出现紧张。
这时候宗庆后的一个选择,让他后悔了十余年、被掣肘了十余年。
彼时大环境是遍地招商、合资光荣,合资企业甚至能享受超国民企业待遇。这就给了法国达能公司机会,彼时达能是全球第六大食品公司。
宗老板资金紧张却不想借钱,银行行长请他吃饭都不去,而是选择与法国达能等合作,抬高娃哈哈地位,哪怕让出51%的股份、娃哈哈的品牌过继到合资公司名下也在所不惜。
当时娃哈哈集团下将近一半的厂子参与到合资,剩下的非合资厂子则还是宗庆后自己的。
宗老板想着只要经营权在手就什么都跑不了,但彼时的国人哪见识过外面玩了上百年的资本游戏呢。
达能带来了大笔资金,但是众多合资公司就不再是宗老板说了算,而是设立的董事会说了算,董事会中外人占了3个席位,宗老板这边占2个席位,合作一开始还是小甜甜,之后很快就变成了牛夫人。
以前啥事都是自己当家作主,成立合资企业之后,做什么都得通过董事会,90年代后期高速发展阶段,宗庆后想上生产线,董事会掣肘,想建原料厂,董事会别的地方有更便宜的、不需要自己建,几个回合下来,宗老板才明白,这是自己把关进自己笼子了。
自己掌控的时候干一件事花十分力,合资之后干一件事花十二分力气,起码得有十分放在内部沟通成本上,娃哈哈净利润从1996年1.11亿元到2006年的10.91亿元,但宗老板要支出1万块钱可能都得通过董事会。
这里的资本套路有多恶劣呢,合资之初宗庆后一方占股49%,达能和百富勤加起来占比51%,1998年香港百富勤因为金融风暴把股权卖给了达能,达能直接占了51%。
为了逼宗庆后低头,达能在2000年收购了当时在纯净水版图上能与娃哈哈竞争的乐百氏,用于跟娃哈哈打价格战,但达能极烂的管理搞得乐百氏先趴窝,就像宗庆后在之后的公开信里写的:“回想与他们激烈争斗的11年2个月还算是命大、长寿的,与乐百氏中方经营者早被人砍了头,赶出了疆场相比还是幸运的。”
合资11年之后,2007年6月宗庆后发给法国达能集团一封公开信,公开信中在第一部分阐述担任合资企业董事长11年来的成绩,后面全部是谈感受。
与其说是感受,倒不如说是怒斥法国达能在企业经营过程中的恶劣和不择手段。
很难想象,当时就近乎首富的宗老板面临着“贵方董事永远有理,随时可以把刀架在你头上”
03
双方最终撕破脸是因为一向收钱但又拖娃哈哈合资公司后腿的达能发现宗庆后的非合资公司利润惊人,能与合资公司比肩。
当初签合同的时候,商标被纳入合资公司,换句话说宗的非合资公司要用这个商标也是要付费的,但具体付多少、怎么付,当时的合同未写,而达能也只以为那些是供原材料的小厂,未加以关注。
但宗老板一直把非合资公司的一部分利润拿出来给到合资公司,让达能业绩增势好看。而当达能真正意识到非合资公司利润惊人的时候,就想低价收购。
被拒后,为达到目的攻击宗庆后的手段包括歪曲媒体舆论、向政府施压、安排人跟踪监视、通过猎头挖销售及管理精英,等等。
商标在合资公司头上,而且合资公司达能占了51%,怎么看都是达能占优势,刀架在宗老板脖子上逼其就范,低价出让非合资公司。
但是很巧,1999年以前,国家为了保护不懂得知识产权的企业,规定商标不得转让给国外企业,所以当时1996年搞合资的时候,所谓商标转让是无效的,达能忙着并购其他企业和上市,这事儿就被忘了。
商标转让无效,给宗庆后的翻盘带来一丝契机,更没想到的是关键时刻达能自己作死,只知道收钱而不知道彼时快消品行业得渠道者得天下,竟然给娃哈哈的全体员工和经销商发公开信,唆使他们背叛
可达能除了会收钱和掣肘,连各个合资厂子大门往哪开都不知道,换句话说,快消品的经销商只认宗老板哪认得你达能是谁啊。
这就导致合资公司的产品销量直线下滑;同时,宗庆后直接撂挑子不干了,然后才有了上面的《宗庆后致法国达能集团的公开信》,然后专心搞自己的非合资公司,非合资公司产品照样火爆。
之前达能一年就把并购的乐百氏折腾到巨亏,如果合资娃哈哈这头现金奶牛再亏损,那估计达能得吐血。
怎么办,厚着脸皮喊宗庆后回来,但宗老板不可能再给自己带紧箍咒,后面双方谈判、互相找漏洞诉讼,达能也占不到好处,又开始和谈。
最后随着达能在国内数起诉讼的败诉,达能扛不住了,表示自己退出,让宗庆后花500亿回购合资公司股份。这价格傻子才会答应,反正不耽误宗庆后的非合资公司赚钱,继续耗着呗。
直到2009年中期,20多起诉讼达能全败,诉讼费就要5.7亿,加上达能在中国的布局遭受重创,达能拖不起了,最后以30亿元出让了娃哈哈合资公司51%的股权。
宗庆后上演最终的翻盘,堪称现实版商战大片。而且还能在十余年的掣肘之下于2010年坐上首富位置,可见宗老板的眼光决策能力
但宗庆后对员工可不抠。自己一年的开销不到5万元,但能在2022、2023年连续两年给员工发6亿年终奖。
04
翻看宗庆后致法国达能集团的公开信,读完发现其中赤裸裸毫无底线的资本游戏,残酷而又冷血,远比电视剧大江大河的情节还要深刻。
如果把宗庆后与法国达能的商战拍成电影的话,那绝对是经典商业大片,而且还是现实中并不多见的主人公最终绝地反击逆风翻盘的美好结局。
2022年娃哈哈营收500多亿,但始终没有上市传闻,大概也是受前面十余年资本掣肘的因素。所以娃哈哈保持着良好的现金流。
有人担心宗庆后突然去世后娃哈哈会陷入管理权或遗产之争。这其实有点担心多余了,早在2021年12月,宗庆后就准备权力过度,任命其独女宗馥莉为集团公司副董事长兼总经理。
而宗馥莉掌握权力后立即终止与后来出事的王力宏20年品牌代言合作,也被指高瞻远瞩,嗅觉敏锐。但宗馥莉虽是一个女强人,作为独女42岁未婚,也成为宗庆后的最大遗憾。
在过去的20年内,宗庆后曾3次问鼎《福布斯》中国内地富豪榜榜首,身价差不多在500亿左右,被誉为中国的饮料大王。
纵观这些年登上首富宝座的风云人物到锒铛入狱的不在少数,自己玩崩了又或被资本踢出局的更是大有其人
白手起家,历经几十年时代变革而屹立不倒,且公司迄今未易主宗老爷子绝对算得上是商人中传奇。
所以我认为,宗庆后是一名非常值得敬佩的企业家,也值得我们写文纪念。
今天有不少仰慕者自发前往娃哈哈门口献花悼念。宗老,一路走好!

 

转自: https://mp.weixin.qq.com/s/G0d2mNqs-TwOQyt40stNag