美文网首页
flask web项目上线linux服务器遇到的问题总结

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

作者: 月下溪明 | 来源:发表于2019-06-19 19:30 被阅读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, '')

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

    • 未连接数据库,但执行了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;
            }
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/uqrkqctx.html