2015-12-15 38 views
0

我試圖從應用程序獲取JPEG圖像到另一個應用程序。當我收到它,流亮起請求的身體,我儘量使整個文件再次,像這樣:Apache不讓Flask應用程序創建文件

if r.status_code == 200: 
    f = open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + "\\static\\tmp\\" + filename), 'wb') 
    f.write(r.content) 
    f.close() 
    return True 

在本地主機上運行時的工作就好了。該文件就位,就像我上傳文件時一樣。

當我去部署所有的應用程序並對其進行測試,apache沒有讓我做f = open(...),給我的錯誤:

IOError: [Errno 13] Permission denied: u'/var/www/my_url\\static\\tmp\\2378687.jpeg' 

這很奇怪,因爲TMP文件夾具有屬性

unconfined_u:object_r:httpd_sys_rw_content_t:s0 

不應該讓我創建新文件,即使不是sudo用戶?

+1

您不寫入tmp文件夾。 '\\'不是linux上的目錄分隔符 – hop

回答

2
  1. 使用os.path.join而不是\\。這使得你的代碼在linux/windows操作系統之間更加便攜。

    f = open(os.path.join(os.path.dirname(os.path.realpath(__file__), "static,"tmp" , filename), 'wb')

  2. 你是不是指到/ tmp,而不是你想在靜態文件夾中寫:/var/www/my_url。嘗試爲此使用絕對路徑。

+0

這解決了它。我完全忘記了斜槓。該文件不會打開,因爲它以某種方式損壞。但它可能與Apache無關。謝謝你的時間! – edwardffs

1

您的函數的第一行有一個錯誤。它應該是

f = open(os.path.join(os.path.dirname(os.path.realpath(__file__), 
         "static", "tmp", filename), 'wb') 

在Windows和Linux上,目錄分隔符是不同的。這就是它在本地工作的原因,但不在服務器上。 os模塊用於抽象出這些差異,但實際上並未使用它來構造文件名。您的代碼編寫方式,os.path.join()是一個noop。

您的代碼嘗試將名爲my_url\static\tmp\2378687.jpeg的文件寫入目錄/var/www/my_url

此外,你應該使用context manager,大概配置爲文件路徑不變,並捕捉錯誤是不錯的主意,太:

UPLOAD_DIR = '/var/www/my_url/static/tmp' 

if r.status_code == 200: 
    try: 
     with open(os.path.join(UPLOAD_DIR, filename), 'wb') as f 
      f.write(r.content) 
    except IOError as e: 
     # log e.message or something 
     return False 
    return True 
+0

這是一個不錯的主意,試圖捕獲異常,感謝您的建議。我不會修復「UPLOAD_DIR」,因爲我不得不改變很多代碼,現在這樣做。 – edwardffs

相關問題