Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django如何真正处理开发服务器上的多个请求?_Python_Django_Django Rest Framework - Fatal编程技术网

Python django如何真正处理开发服务器上的多个请求?

Python django如何真正处理开发服务器上的多个请求?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在制作一个小django应用程序,为我的react前端提供翻译服务。其工作方式如下: 前端尝试使用键查找翻译 如果找不到该密钥的翻译,它将向后端发送一个包含缺少的密钥的请求 在后端,缺少的密钥被附加到json文件中 当一次发送一个请求(当一个请求完成时,另一个请求被发送)时,一切正常。但是当同时发送多个请求时,一切都会中断。json文件已损坏。就像所有的请求都在同时更改文件一样,这导致了这种情况的发生。我不确定是否是这种情况,因为我认为文件不能由两个进程同时编辑(如果我错了,请纠正我),但我

我正在制作一个小django应用程序,为我的react前端提供翻译服务。其工作方式如下:

  • 前端尝试使用键查找翻译
  • 如果找不到该密钥的翻译,它将向后端发送一个包含缺少的密钥的请求
  • 在后端,缺少的密钥被附加到json文件中
  • 当一次发送一个请求(当一个请求完成时,另一个请求被发送)时,一切正常。但是当同时发送多个请求时,一切都会中断。json文件已损坏。就像所有的请求都在同时更改文件一样,这导致了这种情况的发生。我不确定是否是这种情况,因为我认为文件不能由两个进程同时编辑(如果我错了,请纠正我),但我没有收到这样一个错误,表明请求是根据和一次处理一个

    此外,我还尝试了一些让我惊讶的方法,那就是将
    time.sleep(1)
    添加到我的
    api视图的顶部。当我这么做的时候,一切都如期进行

    发生了什么事

    以下是代码,以防万一:

    @api_view(['POST'])
    def save_missing_translation_keys(request, lng, ns):
        time.sleep(1)
    
        missing_trans_path = MISSING_TRANS_DIR / f'{lng}.json'
    
        # Read lng file and get current missing keys for given ns
        try:
            with open(missing_trans_path, 'r', encoding='utf-8') as missing_trans_file:
                if is_file_empty(missing_trans_path):
                    missing_keys_dict = {}
                else:
                    missing_keys_dict = json.load(missing_trans_file)
        except FileNotFoundError:
            missing_keys_dict = {}
        except Exception as e:
            # Even if file is not empty, we might not be able to parse it for some reason, so we log any errors in log file
            with open(MISSING_LOG_FILE, 'a', encoding='utf-8') as logFile:
                logFile.write(
                    f'could not save missing keys {str(list(request.data.keys()))}\nnamespace {lng}/{ns} file can not be parsed because\n{str(e)}\n\n\n')
            raise e
    
        # Add new missing keys to the list above.
        ns_missing_keys = missing_keys_dict.get(ns, [])
        for missing_key in request.data.keys():
            if missing_key and isinstance(missing_key, str):
                ns_missing_keys.append(missing_key)
            else:
                raise ValueError('Missing key not allowed')
    
        missing_keys_dict.update({ns: list(set(ns_missing_keys))})
    
        # Write new missing keys to the file
        with open(missing_trans_path, 'w', encoding='utf-8') as missing_trans_file:
            json.dump(missing_keys_dict, missing_trans_file, ensure_ascii=False)
    
        return Response()
    

    您必须确保没有两个线程或进程同时写入同一个文件。这不是Django的问题,规则通常适用。您可以使用锁(对于具有多个进程的生产设置,可以使用锁文件),或者使用更安全的线程,例如带有传输的数据库。此应用程序不适用于生产。我这样做是为了帮助我的前端国际化,因为我看到的其他解决方案对我来说很昂贵。实际上,我只是尝试使用数据库而不是文件,效果很好。但我真的很想知道为什么它不能处理文件。你能告诉我更多关于锁定和线程安全的应用程序(链接)吗?你应该自学如何编写线程安全的应用程序。这个话题太广泛了,这里无法解释。我会调查的