Django 实现单点登录(SSO)

来自:CSDN,作者:亓官劼

链接:https://blog.csdn.net/qiguanjiezl/article/details/114435883

SSO简介

单点登录(Single Sign On)功能是一个非常常用的功能,尤其是我们在多个系统之间需要登录同步的时候,例如我们在登录QQ空间后,再去QQ的其他网站,都是默认登录的状态,这就是单点登录。
单点登录有很多种实现方法,这里介绍一个通过共享session的实现方法。实现共享session要做的就是要让多个不同应用共用同一个session,但是session默认的是每个应用一个独立的session和cookie的,所以这里要对session的存储进行配置。
除了默认的session存储,我也可以设置让session存储在文件、缓存或者数据库中。
如果我们让session存储在一个固定位置或者数据库中,然后我们设置各个应用cookie的domain为父域地址即可实现各个cookie的相同,从而时候各个cookie中存储的sessionID一致。

搭建测试环境

下面我们来创建两个空的Django项目来进行演示,SSO1和SSO2,这里采用pycharm直接创建两个Django项目,也可以在命令行中使用django-admin startproject sso来创建,其中sso是创建的项目名称。这里也可以使用两个完全相同的项目,在不同地址启动,但是为了演示效果,这里创建了2个。
Django 实现单点登录(SSO)
创建好两个项目后,我们要给项目写一个模拟的登录,注销的功能。
templates文件夹下创建文件login.html文件。这里直接使用之前写过的登录页面的代码,样式就不加了,在SSO1和SSO2中都加入login.html,具体代码为:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="login_content">
    <div class="page-header" id="page_header">
      <h1>登录<small>Login</small></h1>
    </div>
    <div id="login_form">
        <form method="post">
          <div class="form-group">
            <label for="exampleInputEmail1">Email address</label>
            <input type="input" class="form-control" name="usr" id="exampleInputEmail1" placeholder="username">
          </div>
          <div class="form-group">
            <label for="exampleInputPassword1">密码</label>
            <input type="password" class="form-control" name="password" id="exampleInputPassword1" placeholder="密码">
          </div>
          <div id="login_butt">
              <button type="submit" class="btn btn-default">登录</button>
              <button type="button" class="btn btn-default" onclick="">注册</button>
          </div>
        </form>
    </div>
</div>
</body>
</html>
然后在SSO1文件夹创建一个view.py文件,用来存放视图函数。(这里仅为演示SSO,就不分模块了。)
创建文件后的文件目录为:(SSO2项目一样)
.
├── SSO1
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   ├── view.py
│   └── wsgi.py
├── manage.py
├── templates
│   └── login.html
└── venv
    ├── bin
    ├── include
    ├── lib
    └── pyvenv.cfg

插入一个小BUG

macbook运行环境,pycharm创建的Django应用有时候初始化有个bug,缺少os库,会报错:
Traceback (most recent call last):
  File "/Users/qiguan/Documents/develop_files/python_files/SSO1/manage.py", line 22in <module>
    main()
  File "/Users/qiguan/Documents/develop_files/python_files/SSO1/manage.py", line 18in main
    execute_from_command_line(sys.argv)
  File "/Users/qiguan/Documents/develop_files/python_files/SSO1/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 401in execute_from_command_line
    utility.execute()
  File "/Users/qiguan/Documents/develop_files/python_files/SSO1/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 345in execute
    settings.INSTALLED_APPS
  File "/Users/qiguan/Documents/develop_files/python_files/SSO1/venv/lib/python3.7/site-packages/django/conf/__init__.py", line 82in __getattr__
    self._setup(name)
  File "/Users/qiguan/Documents/develop_files/python_files/SSO1/venv/lib/python3.7/site-packages/django/conf/__init__.py", line 69in _setup
    self._wrapped = Settings(settings_module)
  File "/Users/qiguan/Documents/develop_files/python_files/SSO1/venv/lib/python3.7/site-packages/django/conf/__init__.py", line 170in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127in import_module
    return _bootstrap._gcd_import(name[level:], packagelevel)
  File "<frozen importlib._bootstrap>", line 1006in _gcd_import
  File "<frozen importlib._bootstrap>", line 983in _find_and_load
  File "<frozen importlib._bootstrap>", line 967in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728in exec_module
  File "<frozen importlib._bootstrap>", line 219in _call_with_frames_removed
  File "/Users/qiguan/Documents/develop_files/python_files/SSO1/SSO1/settings.py", line 57in <module>
    'DIRS': [os.path.join(BASE_DIR, 'templates')]
NameError: name 'os' is not defined
如果有这个报错的话,在setting.py中导入os即可:import os
然后我们在两个项目的view.py中写入登录和注销函数:
from django.http import HttpResponse
from django.shortcuts import render, redirect


def login(request):
    if request.method == 'GET':
        if 'usr' in request.session:
            # 如果session中已有信息,则显示
            usr = request.session['usr']
            password = request.session['password']
            return HttpResponse("usr:{},password:{},sessionid:{},cookie:{}".format(usr,password,request.session.session_key,request.COOKIES))
        return render(request,'login.html')
    if request.method == 'POST':
        usr = request.POST['usr']
        password = request.POST['password']
        request.session['usr'] = usr
        request.session['password'] = password
        return HttpResponse(
            "usr:{},password:{},sessionid:{},cookie:{}".format(usr, password, request.session.session_key,
                                                               request.COOKIES))


def logout(request):
    request.session.clear()
    return redirect('/login')

url.py中添加路由信息:

"""SSO1 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from . import view
urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/',view.login),
    path('logout/',view.logout),
]

Django默认配置了csrf,需要将它注释掉,在settings.py文件中搜csrf,然后注释掉。
修改后的settings.py文件为:
"""
Django settings for SSO1 project.

Generated by 'django-admin startproject' using Django 3.1.7.

For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""

from pathlib import Path
import os

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'o=blc^vzeb1&g*b!si(wtxe44_=i5cv(3jqm2*u2u&7vgj%&=%'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'SSO1.urls'

TEMPLATES = [
    {
        'BACKEND''django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS'True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'SSO1.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE''django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME''django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME''django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME''django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME''django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'

然后分别为两个项目做数据库迁移,创建一些Django项目的基础库:python3 manage.py migrate
两个项目都是同样的配置,这样我们目前两个测试的项目就搭建好了,然后我们分别启动他们在不同的端口。这里我们就直接手动启动了,分别启动在5000和6000端口。
python3 manage.py runserver 127.0.0.1:5000
python3 manage.py runserver 127.0.0.1:7000
启动两个项目:
Django 实现单点登录(SSO)
Django 实现单点登录(SSO)
现在我们分别在浏览器中打开http://127.0.0.1:5000/login/http://127.0.0.1:7000/login/,显示的页面都是登录页面,显示如下:
Django 实现单点登录(SSO)
这时我们在http://127.0.0.1:5000/login/随意输入账户密码点击登录,显示:
usr:123,password:123,sessionid:None,cookie:{'csrftoken''8YPzJbY03sHJUZH6kdFZzr9TkDtdVTKflgDDeIn0wgGC6cAeudcrkXLyIxXBEnzG'}
此时我们进入http://127.0.0.1:7000/login/,发现这个应用中,显示的还是之前的页面,登录没有同步。下面我们来实现我们的SSO,这里的实现方法非常的简单,这里提供2中实现方法:
  • 将session固定存储在同一个文件中,
  • 将session存储在Redis中

将session存储在同一个文件中实现SSO

我们在SSO2文件下创建了一个session文件夹,这个文件夹位置任意,写绝对路径即可。
然后我们在两个项目的settings.py中对cookie和session进行配置
# 设置cookie的domain为父域domain,
# 如果是使用域名,以百度为例,主域名为`www.baidu.com`,旗下各个应用为:'asd.baidu.com'
# 则这里设置为:`.baidu.com`
SESSION_COOKIE_DOMAIN = '127.0.0.1'

# 设置session存储在文件中
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 设置存储位置,这里设为绝对路径
SESSION_FILE_PATH = '/Users/qiguan/Documents/develop_files/python_files/SSO2/session'

注意一下,这里配置的都是一样的,但是如果两个项目名称不一样的话,是不能直接将完整的settings.py直接复制到另一个的,因为里面有一些项目的配置,例如ROOT_URLCONF = 'SSO1.urls'WSGI_APPLICATION = 'SSO1.wsgi.application'这些前面的都是项目名,需要主要区分。
此时我们在打开
http://127.0.0.1:5000/login/,输入账号密码,此页面显示:
usr:123,password:123,sessionid:2bs2nx2iq879epxu7au7o1zq63o095v7,cookie:{'sessionid''2bs2nx2iq879epxu7au7o1zq63o095v7''csrftoken''8YPzJbY03sHJUZH6kdFZzr9TkDtdVTKflgDDeIn0wgGC6cAeudcrkXLyIxXBEnzG'}
此时我们在打开http://127.0.0.1:7000/login/,我们直接访问,而不用登录,发现显示同样的内容,即我们使用的是同样的内容,实现了SSO。

使用Redis实现SSO

使用文件系统上实现共享session在小并发系统上不会出现问题,但是并发量大的话,会出现一些问题,所以我们这里再介绍一下使用Redis的实现。
需要自行安装Redis,并且在两个项目使用的Python中安装Django-redis:
pip3 install django-redis
在做好这些之后,修改settings.py文件,将使用文件存储session的配置注释掉,修改为:

# # 设置session存储在文件中
# SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# # 设置存储位置,这里设为绝对路径
# SESSION_FILE_PATH = '/Users/qiguan/Documents/develop_files/python_files/SSO2/session'

# 使用Redis存储session
CACHES = {
    "default": {
        "BACKEND""django_redis.cache.RedisCache",
        "LOCATION""redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS""django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "123",
        }
    }
}

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 60 * 5

此时我们再来测试一下两个应用,这时我们先访问一下logout,将session清空,然后访问:http://127.0.0.1:5000/login/,输入账户密码后显示:
usr:123,password:123,sessionid:None,cookie:{'csrftoken''8YPzJbY03sHJUZH6kdFZzr9TkDtdVTKflgDDeIn0wgGC6cAeudcrkXLyIxXBEnzG'}

此时我们访问http://127.0.0.1:7000/login/(不登录),显示同样的usr和password信息。

此时我们的SSO也可以正常实现。

好了,本文就先到这里,大家如有需要,可以根据具体的业务进行实现,这里就不赘述了。等以后有空再写一些Django相关的开发博客。

中招改革后,徐汇杨浦是地狱还是天堂?

 

 

 

 

 

 

 

 

上一篇回顾了上海教育改革的进程👉再说一次,选区定终身,我提到了一个概念:选区定终身!
 
最开始的选学校逻辑是:初中没有学区房,选好小学就行,初中择民办。
 
随着公民同招、民办摇号的落地,选学校逻辑发生了变化:双学区是主流,买学区房的时候,小学初中都要看,甚至初中占比更大。
 
受北京“多校划片”的影响,上海家长选学校的逻辑又从选学区变成选片区。
 
再加上中招细则的发布,市重点高中的50%~65%都是分配到区和分配到校,选择在哪个区中考十分关键。
 
看了上一篇文章,有粉丝说:作为老杨高人,本来就不觉得徐一杨二,现在四校录取率下去了,杨浦的市重点又不行,真是雪上加霜。
 
也有粉丝问:这样的话,徐汇是不是就没有优势了?
 
“徐一杨二”是否真的成了老黄历?今天我们就来分析分析。
 
 
01
为什么一直说“徐一杨二”呢?
 
先来说说徐汇。
 
徐汇的教育资源有多丰富,相信家长们也都有所耳闻了。
 
徐汇有高中17所,其中市重点高中6所,占比35.3%,区重点高中5所,占比29.4%。虽然看上去徐汇的市重点高中占比不及黄浦,但质量绝对是有过之而无不及。
 
徐汇的高中质量从前几年的一本率上就可见一斑,甚至有2所区重点也是市重点的水平。所以如果根据高中质量的维度来看,徐汇的市重点级别的高中占比达到了47%
 
中招改革后,徐汇杨浦是地狱还是天堂?
 
除了高中之外,徐汇的小学和初中也是非常能打,如果徐汇自称第二,无人敢称第一。四大公办和四大民办都是大家耳熟能详的存在,尤其“民办一哥”华育,三分之一能进上中。基本上在校内排名前120,都能拿到上中的门票。
 
再来看杨浦。
 
作为复旦大学的所在地,杨浦区是整个“复旦系”的发源地,尤其复旦附中,一本率高达95%。
 
杨浦有高中14所,其中市重点高中4所,占比28.6%, 区重点高中9所,占比64.3%。虽然市重点占比不算最强,但区重点占比很抢眼。14所高中里,只有1所普通高中,另外13所都是重点。毫不夸张第说,杨浦无弱校。
 
前面讲到了徐汇的“一哥”,可以与之相提并论的要属杨浦的“民办一姐“兰生复旦了。而在小学阶段,二师附小、打一、控二都是家长们公认的好学校。
 
所以,“徐一杨二”绝非浪得虚名,对于想进四校的学生和家长来说,大部分小升初的目标都是民办一哥和一姐。
 
为什么这么说呢?
 
 
02
前面说过,华育三分之一的学生能进上中,兰生复旦三分之一的学生能进复旦附中。这两所学校为什么这么牛呢?因为受到了上中和复旦附中招生的倾斜。
 
在中招改革前,四校有60%的名额是通过自招录取的,而不是中考。
 
自招是高中自己说了算的,华育是上中的初中教学基地,兰生复旦也是始于复旦附中,自然都会受到亲爹的照拂。
 
除了自招的优势,旦附中给杨浦区10个平行志愿名额,上中给徐汇区42个平行志愿名额,绝对是这两个区的独享,其他区完全没有这种机会。
 
但是中招改革之后,这种倾斜大幅减弱。
 
四校自招比例从60%降低到15%~35%,可以说是断崖式削减。
 
中招改革后,徐汇杨浦是地狱还是天堂?
 
从上表中可以看出,在四校的招生名额上,杨浦和徐汇的影响是最大的,之前的大蛋糕被切去了30%。
 
四校变成了全上海的四校,不再是个别区的专属。
 
所以,对于徐汇和杨浦的顶级牛娃来说,在四校自招这个赛道上竞争变得更加激烈了。
 
不过细心的家长或许也发现了,虽然徐汇和杨浦的四校录取率降幅最大,但横向比较,仍旧是录取率最高的两个区。
 
另外,平行志愿如何执行,细则还没有出来。如果延续之前,复旦附中和上中继续保留对杨浦和徐汇的平行志愿名额投放,那么这两个区的优势地位将进一步得到巩固。
 

而对于目标是区属市重点高中(主要是优质高中)的学生来说,虽然名额略有减少,但其实也有利好。

中招改革后,徐汇杨浦是地狱还是天堂?
 
这是因为,徐汇和杨浦的高中资源丰富,之前吸引了不少外区的生源。
 
而中招改革后,由于名额分配的原因,区属市重点是更多倾斜本区的,所以周边区的牛娃势必回流本区。
 
尤其闵行的顶级牛娃,留在本区的好处更多,四校和七宝中学都有得选,还有四校分校和其他市重点分校,大可不必来徐汇竞争。
 
这对于原来竞争过于激励的徐汇学生来说,缓解了不少压力。
 
对于杨浦来说也是一样。虹口和静安的牛娃也会因为区内名额分配的优势而回流本区,对于杨浦的牛娃来说绝对是个利好。
 
那么回到今天的问题,“徐一杨二”还能选吗?
 
 
03
对于不同的家庭来说,我的建议也会不一样。
 
已经在徐汇和杨浦的,不需要逃离。原因前面分析过了,这两个区凭借优质的教育资源,依然是很好的选择,可不要身在福中不知福。
 
孩子还小,正在为选学校纠结的家长,建议以终为始,看目标。目标上中,毫无疑问,就是徐汇。目标复旦附中,毋庸置疑,就是杨浦。
 
有的家长可能会问:不追求四校八大,普娃能选吗?其实是可以。
 
徐汇和杨浦的优点是:进可攻,退可守。谁也不知道孩子未来发展如何,到底是上中和复旦附中的料还是普高的料。
 
但建议家长也要做好心理准备,这两个区的孩子从小就在鸡血的氛围里长大,个个都很能打。家长能否适应这样的环境可要想清楚,如果太佛系的就不要自虐了。
 
条条大路通罗马,如果为了升学而破坏了亲子关系可就得不偿失了。
 
最后需要提醒家长的是:这两个区的入学门槛比较高,对于入户年限要求相对严格。
比如杨浦的打一和控二基本上要三户口三年,而徐汇的热门学校也大多要入户三年左右,建议考虑这两个区的家长要早点规划。
 
当然,也不是所有的学校都要求这么高,入户1-2年、甚至人户一致就能进的好学校也有,家长们可以做些功课,也可以直接来找我们的专家顾问做咨询。
 
End /

转自:https://mp.weixin.qq.com/s/LxRZmmrLHSy_93XsjNKEnQ

顶级专家再谈肿瘤治疗乱象,患者如何避免“人财两空”?

培养、训练出一个能够把癌症看明白、能将错误减少到百分之几的医生太难了,这点全世界都一样。

作者:贺涛

来源:全现在(ID:quanxianzaiAPP)

4月18日,北医三院肿瘤内科医生张煜在知乎发文,实名揭露肿瘤治疗黑幕,将矛头指向自己所在的肿瘤科医生群体。他还将来自上海某三甲医院的医生陆巍作为直接投诉对象,称其以赚取利益为首要目的,向患者推荐无用、无效的诊疗方案。

 

张煜还请求国家早日设立医疗红线,遏制肿瘤治疗中的不良医疗行为。据悉,国家卫健委已经对此开展调查核实。

 

顶级专家再谈肿瘤治疗乱象,患者如何避免“人财两空”?

张煜医生的知乎发帖截图

 

这一事件背后蕴含的关键问题是:

 

肿瘤医生是不是一定要遵从权威的肿瘤治疗指南?

如何消除医患之间不对等信息所带来的沟通障碍?

部分医生违背职业道德的行为,是否能仅仅依靠监管来解决问题?

最关键的是,作为患者或患者家属,该如何寻找靠谱的医院和医生,如何判断自己所接受的治疗是否规范,以及如何保证自己的权益?

 

就这一系列问题,全现在专访了国内著名病理学专家、原武警总医院病理科主任纪小龙教授。在肿瘤治疗领域,病理诊断是“金标准”,病理医生是“医生的医生”。纪小龙是全世界第一个用原子显微镜做病理观察的医生,曾解剖了中国第一例死于艾滋病的患者遗体并发表了论文。

01

乱象

全现在:张煜医生说,在绝大多数情况下,肿瘤的治疗不应该人财两空,而应该治疗效果比目前更好并且花费更少。在你看来,他说的现象是实情吗?

 

纪小龙:说肿瘤治疗太笼统,肿瘤分良性、恶性和介于两者之间的。他所指的应是恶性肿瘤治疗,也就是癌症治疗。只有癌症的治疗才会人财两空。

 

哪一个癌症的治疗不是人财两空?恶性肿瘤患者最终都是死亡的;而多数癌症患者只要还生存着,总会想方设法去治。所以说,癌症治疗最后的结果一定是人财两空。

 

全现在:张煜在帖子里指出了医生方面的责任,他觉得很多情况下,这种人财两空的情况是由负责治疗肿瘤的医生所造成的。你觉得医生造成这种现象的责任占比有多少?

 

纪小龙:这绝不是医生单方面的问题,这里涉及的因素很多。

 

首先,中国是人口大国,也是癌症大国。基数大,问题多,自然会出现这种过度治疗。

 

第二,县级以下的基层医院,包括一些地级市以下的医院,在癌症治疗上是不规范的。为什么患者一查出得了癌症,就要往北京、上海、广州跑?最起码也要到省会城市,就是因为基层医院治疗不规范。

 

第三,癌症诊断谈何容易。人体的恶性肿瘤在医学上能叫出名字来的,有几百种之多。像普通的感冒、胃病,也会诊断错误,只不过这些小毛病不会死人;但是癌症诊断错误的话,患者是要送命的。

 

目前不管是中国,还是全世界,癌症诊断的错误率大概在50%。一开始诊断就错了,最后治疗必然就是错的,你说这个问题严重不严重?我在给病人会诊的时候,每天都会遇到这样的误诊案例。

 

全现在:主要是不是因为癌症这个病太复杂了,以致现有认知不太能够准确认识它?

 

纪小龙:不是,主要是培养、训练出一个能够把癌症看明白、能将错误减少到百分之几的医生太难了。这点全世界都一样。

 

所以你不能怪单个医生,没有搞清楚就给患者乱治。这种现象很普遍。我今天早上刚刚会诊了一个病例,患者是24岁的女孩。她发现自己的眼睛有点斜,她的家长还挺明白,直接带她到上海检查。上海的医院查出她的胸部有一个肿瘤,眼睛斜就成了小问题,赶快开刀把肿瘤取出来。这家医院诊断为恶性肿瘤,需要进行后续治疗。

 

孩子的家长比较理性,他把病历借出来,到北京来会诊。开始一看,貌似是恶性的,但根据我们的经验,最终判定是良性的。那只要手术去掉就没事了。试想,如果她的家长不来会诊,岂不是一个健康孩子就要去接受放疗、化疗?这样的例子比比皆是,每天都有。

 

传统的癌症治疗有三大法宝,手术、放疗、化疗。这是一线治疗。有的恶性肿瘤一线治疗没有效,这时候所谓的二线就上来了,二线是什么呢?比如免疫治疗、基因治疗等生物治疗。问题是,这些二线治疗的效果都还在不断地改进和摸索、取得新数据的过程中。这就是中国的癌症治疗需要改进的地方,目前大量的生物治疗基本上都是在打擦边球。

 

这个领域,许多药厂会邀请医生开学术研讨会,把有关的肿瘤医生都找来,介绍他们的新方法,然后每介绍一个患者接受新疗法,就给高额的提成。

 

顶级专家再谈肿瘤治疗乱象,患者如何避免“人财两空”?

医患关系,患者处于绝对弱势

 

02

动机

全现在:这种提成会促使医生把这些新药或疗法,主动推荐给并不适用的患者吗?如果真是这样,医生的首要目的不是治愈患者了,更像一个推销员。

 

纪小龙:当然有了。患者又不懂,医生说现在这个方法怎么先进,患者就容易相信,你有什么办法?目前我能想到的方案,只有把收费压下来,生物治疗动辄几十万元花费。你把费用降下来,他就不会去走这条路了。

 

全现在:但有业内观点认为,如果研发新药得不到高额回报,不利于药厂去做创新。

 

纪小龙:任何事物能够往前走得下去,都是在利和弊的两端取平衡。

 

全现在:一个癌症患者或者他的家属在拿到医生的治疗方案以后,例如已经是三甲医院的权威医生的诊断,他此时是否应该相信这个诊断?

 

纪小龙:此时一定要不怕麻烦,再找另一家规范的医院,获得第二医疗意见,目的就是减少癌症的诊断错误。这种错误太常见,不是罕见。

 

目前中国跟医疗制度比较完善的国家相比,在癌症治疗上有明显差距,其中之一是很多医院竟然不外借病人的资料。这是违背医疗规范的,即使卫健委明文规定病历可以借阅,这些医院也不遵守。医院对患者的这种不对等做法太常见了。

 

如果第二医疗意见和第一家是一致的,患者就不用再跑了。如果两家不一致,就得再找另外一家去诊断。

 

全现在:患者和医生、医院之间这种悬殊的地位对比,患者太弱势了,再加上现在医患关系紧张,患者不相信医生、医生防着患者,怎么去保证患者的知情权?

 

纪小龙:患者和家属永远不会全部都搞明白,因为医学的专业门槛很高,背后还有一系列的基础理论和实践经验,不是10分钟20分钟能解释清楚的。癌症患者唯一能保证自身利益的,就是要到正规的医院去就医。在癌症的治疗上,如果诊断是规范的,而且第二家第三家都意见一致,你就可以大致放心。

 

顶级专家再谈肿瘤治疗乱象,患者如何避免“人财两空”?

因为医学的专业门槛很高,患者和家属永远没有完整的知情权。

 

03

纠偏

全现在:医疗领域的过度诊断、过度治疗是个老问题,尤其是肿瘤治疗领域更值得关注,因为它涉及到患者的生死,治疗花费也巨大,癌症就像一根杠杆,把其它领域的过度医疗现象给放大了。在接近一半的误诊比例中,有没有医生明知道治疗不适合患者,但还是故意要推荐的?

 

纪小龙:每年全球的肿瘤医生都参加各种会议,来形成肿瘤治疗的共识,现在多数肿瘤都有标准的治疗方案,正规医院的正规医生就按照这个来治疗。中国由于人口多,癌症病人多,基层的共识执行得不好。在三甲医院,医生不太可能冒这个险。现在三甲医院都是电子化病历,每一步都留有证据,医生要是这么干了,一查就发现了。

 

但要注意,这只是说在正规治疗、共识治疗上,对于二线的生物治疗,由于它不在共识范围内,就很难说了。

 

全现在:实际上张煜医生爆料的主要也是二线治疗,有些医生没有用一线治疗先做一下,看看效果,而是直接推荐二线治疗。

 

纪小龙:这种情况主要也出在基层医院,正规大医院这么做明显违章,医生在医院没法待。

 

全现在:有些医生可能真的没有把患者生命放在第一位,而是优先采取给医生本人带来利益的治疗方案,你如何看待这种行为?

 

纪小龙:我觉得这种情况可以算故意伤害了,因为他是在知道不应该这么做的情况下,为了利益去这么做。

 

全现在:从这些医生的角度想,他之所以不害怕惩罚,心里也是有权衡的,包括这么做值不值、一旦被发现可能会受到怎样的处罚。

 

纪小龙:关键是患者很难拿到证据。很多基层医院不规范,病历没有电子化,没有存档,他可以否认自己说过的话。

 

全现在:患者也会特别担心,一旦自己遇到类似的情况,他怎么去维权?或者说,如果患者对于最终治疗效果不满意,进而怀疑治疗方案是不是合理,他们应该如何去印证自己这种怀疑?

 

纪小龙:我刚才说了,只要是正规医院,有电子病历记录,把资料拿到,然后去请教内行人就可以了。

 

20年前,中国的医院还没有普遍电子化,当时很多医患纠纷打官司到法院,法院也没法作出判决,因为缺少证据。现在大医院普遍信息化了,病人也有权复印病历。这些都让那些心术不正、另有所图的人不敢再涉险。

 

在此提醒癌症患者,无论到哪一个医院就诊,一定选择正规的、有电子病历的,这样有据可查,医生也就不敢随心所欲。

 

全现在:但患者还会怀疑,会不会出现所谓的同行相护?就算到了医疗事故鉴定的程序,能相信医疗鉴定组的结论吗?

 

纪小龙:我经历过的这类情况太多了,中国这么多年发生医疗纠纷、做医疗事故鉴定的,总有同行互相包庇,互相掩盖,大事化小,小事化了,然后赔点钱了事的情况。这避免不了。

 

但是对于癌症来说,如果你认为在治疗当中受骗,或者遭受了不规范的治疗,你把证据拿到手,然后去比对治疗共识、世界卫生组织的规范,有人包庇医疗事故的鉴定,你就到法院诉讼,法官不是医生同行了,这时还是要靠证据说话。

 

全现在:张煜也给目前的肿瘤治疗乱象提出了一种解决方式,他请求国家尽早设立医疗红线,遏制肿瘤治疗中的不良医疗行为。在你看来,这是一个打击肿瘤治疗乱象的良方吗?

 

纪小龙:一线治疗是有规范的,我觉得他说的红线是指生物治疗的红线,需要下大气力解决,目前唯一会在癌症治疗上出大问题的就是这一块。这就需要监管到位。主管部门要对哪一家开展哪一种生物治疗,收费是多少,有效率有多少,拿出一个监管的条文,明白明白。

 

麻烦在于,目前生物治疗领域的共识还不够到位。

 

最后还是要提醒患者,遇到癌症不要束手无策,首先找一家正规医院,拿到第一诊断,然后再找第二家拿到第二意见;如果不相同,就找第三家。总之先把诊断搞清楚,然后按照正规的方案治疗,正规医院都有规范的共识。千万不要听信那些非正规医院、游医们的忽悠。

– END –

转自:https://mp.weixin.qq.com/s/MHZfoKSjygYoytV-pnh7vA

特斯拉才是真正的“公关大师”

 

 

终于,“决不妥协”的特斯拉还是道歉了。

 

这几天的车展简直快办成了“特斯拉事故展”。

 

先是特斯拉女车主“文化衫”车顶维权,被工作人员暴力架出去。

 

特斯拉才是真正的“公关大师”

 

然后特斯拉副总裁就整了个“不能妥协”的回应,搞的群情激愤。

 

特斯拉才是真正的“公关大师”

 

然后就是几大官媒出场,点名批评。

 

紧接着“不妥协”的特斯拉就跪了,在深夜偷偷发了一则“道歉公告”:

 

特斯拉才是真正的“公关大师”

 

很多人讲之所以闹出今天这些烂事儿,就是因为特斯拉“没有公关”。

 

但是我们来看特斯拉这个回应套路:

 

1、半夜偷摸发道歉

2、该给谁道歉,不向谁妥协,拎的清清楚楚

3、“车轱辘话”说了一堆,关键问题一个没回应

 

文字游戏玩的这么溜,马一龙帐下怎么可能没有懂公关的人?

 

这段时间为特斯拉贡献了大量负面的陶副总裁,多家媒体报道她之前疑似有在著名电视台主持和大厂GR的背景。

 

特斯拉才是真正的“公关大师”

特斯拉才是真正的“公关大师”

 

如果消息属实,她可能会不懂?

 

那很多人就迷惑了:

 

最近特斯拉一堆“负面危机”,但却看不到任何有效的应对措施,甚至连回应都没有,把事故变成危机,这算懂个屁公关?

 

特斯拉的“不公关”,正是马斯克的“另一种公关”。

 

特斯拉才是真正的“公关大师”

 

1、为什么特斯拉不需要公关?

 

一般来说,正常企业搞公关,最主要的诉求是什么?

 

营造“美誉度”。

 

但是特斯拉这个“异类”真的需要美誉度吗?

 

它能把车卖好,很大程度靠的是马一龙:电音之王,精神火星人,大火箭爆破专业户,科技朋克,互联网土豪的人设

 

但是没事就在网上抽烟,喝酒,骂人的马一龙同志的人设和美誉度有半毛钱关系吗?

 

马一龙一开始走的就是“饭圈化运营”的路线,只不过他营造的人设不是什么“德艺双馨的企业家”,也不是“妈妈爱你的流量偶像”,而是一个玩先锋音乐的地下rapper。

 

特斯拉才是真正的“公关大师”

 

一个如此先锋rapper,傲慢一点,固执一点,争议多一点,这是缺点嘛?

 

在狂热粉丝的眼中,这简直迷死人了好吧?

 

你越是强硬,粉丝越觉得你酷,现在的马斯克可以说是“酷到头”了,我们可以称之为科技界“酷头”。

 

至于“美誉度”?

 

粉丝觉得你这才是在骂人。

 

2、为什么特斯拉不怕你骂?

 

很简单,因为你骂的声音再大也不影响它卖货。

 

普通的消费者看到这些新闻,可能就退了,但“拜火星教”的粉丝才是特斯拉的基本盘。

 

只要你够酷,他们就会继续买单,至于骂声,负面,争议,粉丝压根不在乎。

 

越骂人设越稳,越骂越酷。

 

为什么“不安全”狂热粉丝也肯买单呢?

 

先锋的东西有几个是安全的?

 

有钱人最爱的极限运动哪个不是拿着命在玩儿?

 

只要粉丝不在乎,骂声伤害不到它的核心利益,它就永远不会怕。

 

3、为什么特斯拉坚决不肯承认错误?

 

不承认始终就是“争议”,承认了就是板上钉钉的错误了。

 

所以,坚决不能承认。

 

查资料的时候我发现一个很诡异的地方,最近特斯拉有这么多事故和关于“刹车失灵”的争议,但截止到发稿,我没有看到官方给出任何证据确凿,清晰明白的解释,这一切到底是怎么回事。

 

这次深夜的道歉,一样避重就轻,环顾左右而言它:

 

要么解释是用户的操作失误,要么是路面湿滑,要么就是国家电网不稳定,总之跟我没关系。

 

客观一点讲,只要官方不承认,没有确凿的证据证明车子确实有设计缺陷,我们就不能说它有问题,这件事就始终会是“争议”,存在可以解释的空间。

 

这一招就很鸡贼了。

 

更重要的是,道歉有损逼格,认错破坏人设。

 

火星皇帝,永远英明神武,承载着人类星际移民梦想的科技之光,马一龙同志,怎么可能犯错呢?

 

如果非要说错,那一定是人类的错,是地球的错,是牛顿三大定律的错。

 

从现实角度考量,真有问题,道歉,认错,大事化小,息事宁人是更聪明的做法。

 

要说问题,哪个车企没出过问题?

 

屁股擦的够干净,不至于闹成今天这种局面。

 

但是,特斯拉清楚,认错道歉才是毁基本盘的大事儿。

 

粉丝们会觉得你不够酷了,你妥协了。

 

某种程度上说,特斯拉也被自己的人设绑架了。

 

这是走上神坛的代价。

 

特斯拉才是真正的“公关大师”

 

4、为什么特斯拉又道歉了?

 

特斯拉道歉,不是因为错了,而是因为怕了。

 

这就是我为什么觉得粉丝们说“特斯拉理念优先,从不被利益绑架”是扯淡。

 

它这几次的应对策略从来都是利益导向的。

 

消费者维权,它绝不道歉;点名批评,它又可以道歉了。

 

为什么?

 

基于以上的分析,消费者根本伤不到它,骂声更伤不到,所以它无需妥协。

 

但是碰到惹不起的,道歉比谁都快。

 

这事儿,确实还挺火星的。

 

5、最后我想谈一下特斯拉奉行这套公关原则背后更深层的原因。

 

汽车可以说是人类工业制造能力的极限产品。

 

这是一个超级复杂的大型系统,需要几万个零件紧密配合,因为需要对人命负责,行驶中对系统可靠性的要求又极高。

 

设计上有一点缺陷,都可能酿成致命的事故。

 

更要命的在于,有些故障,根本无法事前发现解决,越是复杂的系统越是如此,这是工程学的常识。

 

为什么互联网热衷搞“敏捷开发”,不断的迭代和优化?

 

因为很多Bug只有在运行中才能发现,甚至需要足够长的时间才能暴露。

 

这不是钱能解决的问题,甚至不是人类能解决的问题,这是工程学的“客观规律”。

 

传统车企设计一套方案要跑好多年才敢用,而且轻易不敢改动,原因就在这儿。

 

电动车还是一个非常年轻的行业,特斯拉03年创办,到现在也才不到20年,出现设计缺陷是再正常不过。

 

客观规律摆在这儿,为什么马斯克还要大干快上,蒙眼狂奔,疯狂降价,奔命一样往前跑呢?

 

问题的解决需要时间,马斯克最缺的也是时间。

 

马斯克需要抢规模,规模大了,才能摊薄成本,成本低才能降价打价格战,争取更多用户,继续扩大规模,形成一个正向循环。

 

甚至有一天特斯拉的电动车和乐视电视一样免费送也有可能。

 

规模背后更大的野心是“标准”。

 

马斯克要借助规模效应把特斯拉变成电动车的“行业标准”,在汽车领域再造一个可以收“苹果税”的封闭生态。

 

电池标准按我的走,自动驾驶方案用我的,车载系统用我的,一旦目标实现,所有的车企,上下游供应商,软件开发商,消费者都必须要缴“特斯拉税”。

 

这可是一个比万亿规模的“智能手机”更性感的生意。

 

很多国产电动车企业对用户安全还是非常重视的,官方运营了很多车主群,甚至高管也在其中,问题解决的非常及时。

 

这很好,但缺点就是太慢了。

 

特斯拉跑的是另一个策略:

 

既然电动车技术整体不成熟,问题出现是不可避免的,那为什么要怕出问题呢?

 

为什么要把精力花在“善后”这种没有效益的事情上呢?

 

为什么要给自己立一个“安全”的人设,背上道德包袱呢?

 

在我有限的人生经验中,我发现一个规律,任何领域的竞争中,总是“人渣”获得的竞争优势更大,因为他们为达目的,不择手段。

 

在乎用户的安全,在乎“美誉度”,就一定会束手束脚,所以为什么不直接扔掉道德包袱,打掉用户在安全层面对自己的期待?

 

这才是特斯拉一切迷惑公关行为背后的根本动因。

 

所以即便产品出问题也要抓紧跑,即便出人命也不能停下来,这个策略就是要“牺牲”掉一部分早期用户,为产品优化铺路,去抢规模,抢标准。

 

所以陶总裁才会出来讲,这是“新产品发展的一个必经过程”。

 

这是一个多么冷血的逻辑?

 

你说这是理念,他说这是梦想,归根结底一切都是生意罢了。

 

特斯拉才是真正的“公关大师”

 

 

 

转自:https://mp.weixin.qq.com/s/8LymYhZvMuCl9PNuVCoEqg

在上海,你需要挤掉多少人才能考进985/211大学?

 

都说上海的考生高考容易,但事实真的如此吗?能考入名校的又有多少人呢?今天小奥老师就跟着大家一起看看在上海上学,从小学到高考,一共需要挤掉多少人才能进入上海的985/211大学吧。

首先,以“小学”和“高考”为两个始末节点,将整个过程分为以下四个阶段

第一阶段:小升初

根据上海市统计年鉴可得,2013年上海小学的毕业总人数为13.4万,同年上海初中的招生总人数为12万,也就是说,在小升初阶段,因种种原因少掉了1.4万人。

 

第二阶段:预初至中考

在这个阶段里,有一部分考生因非本市户籍以及种种个人原因,无法参与上海市统一中考,这部分学生据统计大致有4.6万人

 

第三阶段:初升高

据官方公布,2017年参加中考的总人数为7.4万,而普通高中招生人数仅5.3万,大概有2.1万人进入中职校、出国或者走其他路线

 

第四阶段:高考

2017年上海市普通高中招生总人数为5.3万,到2020年参加高考的总人数大概有5万人,这一阶段又少了约3000人。

 

因此,我们截至到高考这个节点之前,从2013年小学毕业的13.4万人,到2020年参加高考的5万人,中间约有8.4万人由于各种原因退出。

 


 

然后,我们再来看这5万名考生中,有多少人可以进入上海地区的985/211大学,也就是所谓的“第一梯队”院校。

 

在上海,你需要挤掉多少人才能考进985/211大学?

本表并未统计艺体批次的招生计划数

(手工整理,难免有所纰漏)

 

分析:

1)第一梯队院校共招生5606人(不计艺体批),在5万名总考生人数中占比约10%

 

2)其中,985院校共4所(复旦医学院、交大医学院与复旦大学、交通大学在这合并为一所),共招生2477人,在5万名总考生人数中占比约为5%,在第一梯队院校招生总人数中占比44%

 


 

综上所述,从小学到高考

你首先已经打败了8.4万人

 

从高考到升入上海地区985/211院校

你打败了4.4万人

 

能够考入上海地区985大学的

你是全上海考生的5%

在上海,你需要挤掉多少人才能考进985/211大学?

转自:https://mp.weixin.qq.com/s/cvGwiN3UVZttrqGS9FmqYQ