docker 安装 sentry 踩坑记录

之前公司项目里用到了sentry。当初很轻松的用docker装好跑起来了,由于要上https。当初用端口区分的方案被换成了用域名访问,一切顺利。由于sentry服务要迁移服务器。考虑到老数据没太大用,所以直接下掉了老得sentry服务,打算重新架一套。万万没想到,走上了一条踩坑路
由于之前一次的经验,所以直接吧配置写到了docker-compose.yml里面,万万没想到,服务直接起不来了。查日志才发现,原来sentry-docker的文档太滞后,所以起服务的方式变了。重新调整姿势,好不容易服务器来了。万万没想到,浏览器没法访问,访问报告400 bad request。照着sentry-docker的评论说要改secure.prefix_url的配置,好不容易吧配置文件搞好,发现一点效果没有。
用w3m在localhost上试了一下,发现果然localhost可以访问。想一下sentey貌似是django写的,估计ALLOW_HOST设置问题,试了一下发现不行。一怒之下attach进去看python源码,看了半天发现sentry改的东西太多了。google半天也没有结果。不过遇到一个妹子和我遇到同一个问题,还在上海,果断github上follow。
想了一下默默的去nginx里吧host改成了localhost:9000(我的sentry放在了9000端口上)
试一下被重定向到了localhost:9000
心说为啥不proxy_redirect一下?
proxy_redirect ~(http://|https://)?.*?/(.*) /$2;
reload之后居然好了。。。
果然有的时候换个思路海阔天空,sentry确实开源版是不想让人用了啊

发表在 日誌 | 标签为 , , | 留下评论

漫话 python 类的私有方法

前几天同事问我关于如何外部访问python私有属性的问题,当时觉得私有属性不应该被外部访问。但是回过头来想一下python私有属性的实现却是很有意思。
先看这段代码

class A(object):
    _a = "this is _a"
    __a = "this is __a"
    def set_private(self, a1, a2):
        self._a = a1
        self.__a = a2
 
    def read_private(self):
        print(self._a, self.__a, self._A__a)
 
a1 = A()
print(a1._a)
print(hasattr(a1.__a))  # => False; 没有__a这个属性
print(a1._A__a)  # 可以成功读取私有变量
a1._A__a = None
a1.read_private()  # 可以从外修改私有变量

貌似python对私有变量的实现就是改了下变量名啊?看着貌似挺简单的,但是聪明的你一定发现了问题,重命名变量如果重名咋办?
看这段例子:

class A(object):
    _a = "this is _a"
    __a = "this is __a"
    _A__a = "this is _A__a"
    def set_private(self, a1, a2=None, a3=None):
        self._a = a1
        if a2:
             self.__a = a2
        if a3:
            self._A__a = a3
    def read_private(self):
        print(self._a, self.__a, self._A__a)
 
a2 = A()
a2.read_private()  # 期望结果是 (this is _a, this is __a, this is _A__a)
#=> (this is _a, this is _A__a, this is _A__a)
## 说明python的私有变量果然只是简单测重命名,规则就是"_{class_name}__{private_name}"
a2.set_private(0, 1)
print(a2.read_private())
#=> 0 1 1
a2._A__a = 2
print(a2.read_private())
#=> 0 2 2

不难看出,类方法内修改__private_name 等价于外部直接访问"_{class_name}__{private_name}"
看似很美好,但如果出现重名的类呢?

class A(object):
  __p1 = 1
  __p = "A1"
  def get1(self):
     print(self.__p, self.__p1)
 
A1 = A
class A(object):
  __p = "A2"
  __p2 = "2"
  def get2(self):
     print(self.__p, self.__p2)
 
A2 = A
 
print(A1, A2)
class B(A1, A2):
   _A__p = "B"
 
b = B()
print(b.get1())
print(b.get2())

不难发现python私有变量只是一种访问的语法糖。在某些情况下,比如利用type函数动态生成的class中使用了相同的类名称和空间。一定会造成私有变量的互相影响,所以再大型项目中需要谨慎使用

发表在 python | 标签为 , | 留下评论

新的开始

忙啊忙,突然发现自己也成了瞎忙族。这两年想做很多事情,结果是很多事情没做成。本来想自己写一个blog系统,结果连写blog也荒废了。
花了两天的时间,吧荒废的网站重新上线,启用了新的域名,加上了https,wordpress部署到了docker里面,从美国机房迁移到英国机房。尝试吧老的数据导入回来。不得不说wordpress虽然有很多缺点,但却是好用。虽然坑也不少,但好歹能用,也没有什么好抱怨的了。比起打王者农药,玩blog虽然也浪费时间,起码更有意义吧。

发表在 日誌, 系统更新 | 留下评论