flask web项目上线linux服务器遇到的问题总结

Linux服务器上flask程序写文件报错PermissionError: [Errno 13] Permission denied: '/app.log'

fh = logging.handlers.TimedRotatingFileHandler('app.log', when='midnight', backupCount=7, encoding='utf-8') 

本地测试正常。会在app.py的同级目录下创建app.log文件并写入。


本地flask项目目录,生成app.log

但在服务器启动该程序时,却报错PermissionError: [Errno 13] Permission denied: '/app.log'。bai了谷了一大堆,都是告诉你打开的是文件夹不是文件要么就是Windows的。唉。
最后受到同事启发,弄到日志目录下,遂改成下面的绝对路径。当当当当~done

fh = logging.handlers.TimedRotatingFileHandler('/var/log/android-bug-search/app.log', when='midnight', backupCount=7, encoding='utf-8') #创建一个文件流并设置编码utf8

当然也要对/var/log/android-bug-search/授予写权限。 直接sudo chmod -R 777 /var/log
最后分析原因应该是线上运行的项目是不能写文件到自己的目录下。(应该也和服务器的环境有关。)


flask的logger使用过程问题

app.logger只能使用在app.py的视图函数中。 其他普通py文件不能使用app.logger,报错importError。(因为其他py需要import app, 而app.py还需要import 这些py,造成循环依赖的问题)

使用current_app。current_app只能在flask的APP启动后还能使用current_app。而且出了个这么个问题:

# 日志系统配置
handler = logging.FileHandler('app.log', encoding='UTF-8')
logging_format = logging.Formatter(
            '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
handler.setFormatter(logging_format)
app.logger.addHandler(handler)

@app.route('/')
def index():
    current_app.logger.debug('xxx')

这样编写,current_app并不会将log重定向写到app.log中,还是输出在控制台。

最后我的做法是在app.py中直接在头部执行如下

fh = logging.handlers.TimedRotatingFileHandler('/var/log/android-bug-search/app.log', when='midnight', backupCount=7, encoding='utf-8') #创建一个文件流并设置编码utf8
logger = logging.getLogger() #获得一个logger对象,默认是root
logger.setLevel(logging.DEBUG)  #设置最低等级debug
fm = logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s - func:%(funcName)s - [line:%(lineno)d] -- %(message)s")  #设置日志格式
logger.addHandler(fh) #把文件流添加进来,流向写入到文件
fh.setFormatter(fm) #把文件流添加写入格式

最后所有py文件都用current_app.logger.xxx打log,都保存到了app.log文件中

from flask import current_app

# 连接数据库
    def connectDB(self):
        try:
            self.db = pymysql.connect(host=self.host, user=self.user, password=self.password, database=self.database,
                                      port=self.port, charset='utf8')
            self.cursor = self.db.cursor()
        except pymysql.Error as error:
            current_app.logger.error('connect mysql error - %s', error)

最后给个建议,flask的app只在app.py中使用,用于做flask项目全局的配置,不要用于其他。

还有一种日志方式,就是写个单例的日志文件使用。


连接mysql,pymysql有时会报无法连接到localhost

self.host = "localhost"  # localhost ,pymysql有时会报无法连接到localhost

我在Mac本机上连接Mysql,有时连接不到localhost,改成127.0.0.1一切正常。但上线linux服务器后使用Localhost未发现异常。


python无法解析单引号json

我在azkanban用shell+python脚本获取Hive数据时,处理得到元组d,然后json.dumps(d)得到json,该json就是单引号格式的,传到服务器后,服务器程序调用json.loads(json)时,报错decodeError。
解决方案:

data = request.get_data()
dic = eval(data) # eval() 可以解决单引号json的问题

pymysql.err.InterfaceError: (0, '')

我这里发现这两种操作,会触发该异常

  • 未连接数据库,但执行了pymysql.insert等增删改查操作
  • 每次连接不关闭,长时间断开会报该异常

html <a>标签设置点击效果

.html

<a style="width:100%;margin-top: 5px; font-size:1em;" href="/" group="mylink" class="my_link_button">错误趋势</a>
<a style="width:100%;margin-top: 5px; font-size:1em;" href="/error_list" group="mylink" class="my_link_button">错误列表</a>
<a style="width:100%;margin-top: 5px; font-size:1em;" href="/log_mapping" group="mylink" class="my_link_button">log mapping</a>

.js

<script>
        $(function () {
            $(".my_link_button").click(function () {
                $("a[group='mylink']").removeClass("my_link_button_select");

                $(this).addClass("my_link_button_select");
                return true; //传递点击事件,使该次点击生效。必须返回true,否则超链接的URL无法跳转
            });

        });

    </script>

.css

.my_link_button {
            display: block;
            width: 100px;
            height: 30px;
            background: #FFFAFA;
            margin-top: 20px;
            font-size: 8px;
            text-decoration: none;
            text-align: center;
            line-height: 28px;
            color: #999999;
        }

        .my_link_button_select {
            display: block;
            width: 100px;
            height: 30px;
            background: #0081c2;
            margin-top: 20px;
            font-size: 8px;
            text-decoration: none;
            text-align: center;
            line-height: 28px;
            color: white;
        }

        .my_link_button:hover {
            text-decoration: none;
            color: white;
            background: #C9C9C9;
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容