首先创建一个SimpleHttpOperator

http_test_operator = SimpleHttpOperator(http_coon_id='http_test_1',endpoint='https://free-api.heweather.com/s6/weather/forecast?unit=m&location=北京&lang=zh&key=*******************',method='GET',response_check=http_resp_check,
)

在测试的时候发现问题如下:

[2018-04-27 11:58:31,880] {http_hook.py:77} INFO - Sending 'GET' to url: https://www.google.com/s6/weather/forecast?unit=m&location=朝阳,北京&lang=zh&key=*********

很明显url和我们想的不一样,查询官方文档得到如下解释:

    Airflow还能够通过操作系统的环境变量来引用连接。环境变量需要加上前缀AIRFLOW_CONN_才能被视为连接。在Airflow管道中引用连接时,conn_id应该是没有前缀的变量的名称。例如,如果conn_id 名为postgres_master环境变量应该被命名 AIRFLOW_CONN_POSTGRES_MASTER(注意环境变量必须全部为大写)。Airflow假定从环境变量返回的值是URI格式(例如 postgres://user:password@localhost:5432/master或s3://accesskey:secretkey@S3)。

airflow会首先根据conn_id在环境变量中寻找对应的host,如果没有则使用默认的,数据库中connection表的http_default的host值:https://www.google.com/

于是先设置环境变量吧

export AIRFLOW_CONN_WEATHER=https://free-api.heweather.com/

并修改代码中endpoint参数如下:

http_test_operator = SimpleHttpOperator(http_coon_id='http_test_1',endpoint='/s6/weather/forecast?unit=m&location=北京&lang=zh&key=*******************',method='GET',response_check=http_resp_check,
)

继续测试,发现调试信息如下:

[2018-04-27 12:21:13,131] {http_hook.py:77} INFO - Sending 'GET' to url: http://free-api.heweather.com/s6/weather/forecast?unit=m&location=北京&lang=zh&key=********************

我们明明设置的https://,怎么变成了http://

查看源码

class HttpHook(BaseHook):def get_conn(self, headers):"""Returns http session for use with requests"""conn = self.get_connection(self.http_conn_id)session = requests.Session()if "://" in conn.host:self.base_url = conn.hostelse:# schema defaults to HTTPschema = conn.schema if conn.schema else "http"self.base_url = schema + "://" + conn.host

实际请求的正是这个self.base_url,那么这个conn.schema是哪来的呢?

class BaseHook(LoggingMixin):@classmethoddef get_connections(cls, conn_id):conn = cls._get_connection_from_env(conn_id)if conn:conns = [conn]else:conns = cls._get_connections_from_db(conn_id)return conns

其实到这里已经看到我们的环境变量是怎么起作用了,也看到了如果环境变量没有设置,是会从数据库中选择的。在数据库中connection表的schema字段正是我们要找的。

    @classmethoddef _get_connection_from_env(cls, conn_id):environment_uri = os.environ.get(CONN_ENV_PREFIX + conn_id.upper())conn = Noneif environment_uri:conn = Connection(conn_id=conn_id, uri=environment_uri)return conn

在这个地方,我们明显可以看到官方文档中的描述(环境变量的设置)是如何被执行的。

class Connection(Base, LoggingMixin):    def __init__(self, conn_id=None, conn_type=None,host=None, login=None, password=None,schema=None, port=None, extra=None,uri=None):self.conn_id = conn_idif uri:self.parse_from_uri(uri)else:self.conn_type = conn_typeself.host = hostself.login = loginself.password = passwordself.schema = schemaself.port = portself.extra = extra  def parse_from_uri(self, uri):temp_uri = urlparse(uri)hostname = temp_uri.hostname or ''if '%2f' in hostname:hostname = hostname.replace('%2f', '/').replace('%2F', '/')conn_type = temp_uri.schemeif conn_type == 'postgresql':conn_type = 'postgres'self.conn_type = conn_typeself.host = hostnameself.schema = temp_uri.path[1:]self.login = temp_uri.usernameself.password = temp_uri.passwordself.port = temp_uri.port

到这里基本上就明白了schema是哪里来的

self.schema = temp_uri.path[1:]

这是什么意思?难道我要写成"https://free-api.heweather.com/https"

各位看官,到这里基本上我们就明白问题所在了

你可以修改这里的源码为

self.schema = conn_type

进行测试。

也可以写成

环境变量也可以设置为"https://free-api.heweather.com/https"

如果你的airflow版本和我的不同,源码可能是下面这个样子:

    # headers is required to make it requireddef get_conn(self, headers):"""Returns http session for use with requests"""conn = self.get_connection(self.http_conn_id)session = requests.Session()self.base_url = conn.hostif not self.base_url.startswith('http'):self.base_url = 'http://' + self.base_urlif conn.port:self.base_url = self.base_url + ":" + str(conn.port) + "/"if conn.login:session.auth = (conn.login, conn.password)if headers:session.headers.update(headers)return session

关键在这里

        self.base_url = conn.hostif not self.base_url.startswith('http'):self.base_url = 'http://' + self.base_url

这里的判断条件(not self.base_url.startswith('http'))必然为真,所以只会拼接“http://”(头大)

除了更改环境变量或者上述代码还要更改代码如下:

def get_conn(self, headers):"""Returns http session for use with requests"""conn = self.get_connection(self.http_conn_id)session = requests.Session()self.base_url = '{}://{}'.format(conn.sharem, conn.host)# if not self.base_url.startswith('http'):#     self.base_url = 'http://' + self.base_urlif conn.port:self.base_url = self.base_url + ":" + str(conn.port) + "/"if conn.login:session.auth = (conn.login, conn.password)if headers:session.headers.update(headers)return session

注意:这样是没有添加证书验证的!

运行会警告:

/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

运行结果:

{'HeWeather6': [{'basic': {'cid': 'CN101010300', 'location': '朝阳', 'parent_city': '北京', 'admin_area': '北京', 'cnty': '中国', 'lat': '39.92148972', 'lon': '116.48641205', 'tz': '+8.00'}, 'update': {'loc': '2018-04-27 17:47', 'utc': '2018-04-27 09:47'}, 'status': 'ok', 'daily_forecast': [{'cond_code_d': '100', 'cond_code_n': '100', 'cond_txt_d': '晴', 'cond_txt_n': '晴', 'date': '2018-04-27', 'hum': '40', 'mr': '16:06', 'ms': '04:04', 'pcpn': '0.0', 'pop': '0', 'pres': '1021', 'sr': '05:20', 'ss': '19:04', 'tmp_max': '27', 'tmp_min': '13', 'uv_index': '7', 'vis': '10', 'wind_deg': '0', 'wind_dir': '无持续风向', 'wind_sc': '1-2', 'wind_spd': '7'}, {'cond_code_d': '100', 'cond_code_n': '100', 'cond_txt_d': '晴', 'cond_txt_n': '晴', 'date': '2018-04-28', 'hum': '41', 'mr': '17:11', 'ms': '04:35', 'pcpn': '0.0', 'pop': '0', 'pres': '1013', 'sr': '05:18', 'ss': '19:05', 'tmp_max': '27', 'tmp_min': '16', 'uv_index': '8', 'vis': '20', 'wind_deg': '188', 'wind_dir': '南风', 'wind_sc': '1-2', 'wind_spd': '7'}, {'cond_code_d': '101', 'cond_code_n': '305', 'cond_txt_d': '多云', 'cond_txt_n': '小雨', 'date': '2018-04-29', 'hum': '43', 'mr': '18:15', 'ms': '05:07', 'pcpn': '0.0', 'pop': '0', 'pres': '1005', 'sr': '05:17', 'ss': '19:06', 'tmp_max': '30', 'tmp_min': '18', 'uv_index': '8', 'vis': '20', 'wind_deg': '181', 'wind_dir': '南风', 'wind_sc': '1-2', 'wind_spd': '10'}]}]}

Airflow的SimpleHttpOperator不支持https问题解决相关推荐

  1. 百度UEditor控件中的map组件不支持https使用的问题解决

    最近项目部署到了https环境下,使用的UEditor富文本编辑器中的map组件出现了问题,控制台报了一堆错误,主要是mixed content.. ,就连百度的官网上也同样是有这些问题,汗.. 没有 ...

  2. Python: subprocess.Popen()不支持unicode问题解决

    Python: subprocess.Popen()不支持unicode问题解决 参考文章: (1)Python: subprocess.Popen()不支持unicode问题解决 (2)https: ...

  3. loadrunner支持https协议的操作方法-经验总结

    问题:用户portal支持https协议,用loadrunner录制登陆脚本时发现未录制到用户名和密码 录制到的脚本如下: login() { lr_think_time(10); web_url(& ...

  4. 新功能:阿里云负载均衡SLB支持HTTPS虚拟主机功能(SNI)

    Greeting 大家好,很高兴告诉大家,阿里云负载均衡SLB支持HTTPS虚拟主机(单VIP多证书功能-SNI),目前已经在所有地域开放,欢迎大家使用.具体内容请大家观看视频. 温馨提醒:视频杀流量 ...

  5. (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新

    iOS开发技术分享群 147787076 [友盟+]友盟统计分析SDK已全面支持HTTPS,请IOS开发者及时升级文档(http://dev.umeng.com/analytics/ios-doc/i ...

  6. curl提示不支持https协议解决方法

    curl提示不支持https协议解决方法 参考文章: (1)curl提示不支持https协议解决方法 (2)https://www.cnblogs.com/biaopei/p/8669810.html ...

  7. Mondrain支持kylin问题解决

    Mondrain支持kylin问题解决 Mdx select {[MEASURES].[UNITPRICE],[MEASURES].[NUMBER]} on columns, {[CUSTOMER]. ...

  8. go get 代理 找不到包_初步看看Go1.10 支持 HTTPS 代理

    Go1.10 支持 HTTPS 代理 Go1.9 出来后 6 个多月的时间,Go1.10 就被发布.新版本带来大大小小的变化(发行说明),但是我想谈谈有关 net/http 包的改变.1.10 版本支 ...

  9. TurboMail邮件系统支持HTTPS双向认证

    2019独角兽企业重金招聘Python工程师标准>>> HTTP单向认证已经被普遍应用,而对企业邮箱安全保密要求更加严格的企事业单位,例如国家保密局等单位,为了达到闭环的安全加密要求 ...

最新文章

  1. mysql getconnection 如何关闭连接_【MySQL】使用连接池获取Connection执行sql以及mybatis事务注意事项...
  2. [Swift]NSString、NSData、Base64互转
  3. perl mysql 数据推拉_Perl操作Mysql数据库
  4. 成功解决RuntimeError: filter weights array has incorrect shape.
  5. React学习:ref调用、组件封装调用-学习笔记
  6. 深度解读服务治理 ServiceMesh、xDS
  7. 想尝试搭建图像识别系统?这里有一份TensorFlow速成教程
  8. sql以什么开头怎么写_如果让你给自己的人生写一个开头,你会怎么写?
  9. 数据库系统异常排查之思路
  10. nginx+php fpm日志报错信息
  11. Error: new BigNumber() not a base 16 number
  12. 【常用0x000000类型颜色代码表】
  13. 给windows7系统盘瘦身
  14. 硬件工程师成长之路(11)——职业规划
  15. Java线程之Exchanger
  16. jsp页面如何调用本机的应用程序?例如c:/netterm.exe?
  17. 使用不正确的主题来学习WordPress主题评论
  18. 手机上流行的各类谜语及谜底
  19. 微型计算机原理-期末
  20. 高校借助电子签章推动学生入网缴费凭证、科研项目拨款单在线签

热门文章

  1. GitHub Pages搭建属于自己的静态网站,并绑定个人域名
  2. c++清空一个txt文本_Linux练习6: 文本查看cat, head, less
  3. This dependency was not found: * !!vue-style-loader!css-loader?……
  4. angular5.0封装underscore常用pipe并发布到npm全套流程
  5. .Net Core建站(2):EF Core+CodeFirst数据库迁移
  6. 构建创业公司突击小团队
  7. 生成某一文件夹内文件清单(批量处理)
  8. Linux应用:FTP
  9. extjs插件开发上传下载文件简单案例
  10. 没有人会告诉您乘坐飞机时的几个事实 但是您一定要知道