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

2019-06-19  本文已影响0人  月下溪明

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, '')

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


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;
        }
上一篇下一篇

猜你喜欢

热点阅读