ปัญหาในการแสดงภาพที่อัปโหลดบน Django

หลังจากที่ผู้ใช้อัปโหลดรูปภาพแล้ว เธอจะส่งกลับข้อผิดพลาด 404 เสมอ ฉันคิดว่านี่เป็นการกำหนดค่าที่ผิดพลาดของ Nginx แต่ฉันไม่แน่ใจและหลังจากค้นหาและพยายามหลายชั่วโมง ฉันก็ยังไม่เข้าใจปัญหา

นี่คือ settings.py ของฉัน:

DEBUG = False
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static'),
)

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

ถัดไป urls.py ของฉัน:

urlpatterns = [
...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

และไฟล์กำหนดค่า Nginx ของฉัน:

location ^/static/ {
    autoindex on;
    alias /home/user/mywebsite/site/static;
}

location ^/media/ {
    alias /home/user/mywebsite/site/media;
}

นี่คือ URL ที่สร้างขึ้นของรูปภาพ: https://www.mywebsite.com/media/CACHE/images/img/venus/758c9f7d70d0c64b5631cc865986de48.jpg (404)

ฉันใช้ Django Imagekit เพื่อจัดการภาพที่อัปโหลด ฉันมักจะพบว่า URL เหล่านี้แปลก ๆ ... บางที ImageKit อาจจำเป็นต้องมีการกำหนดค่าเพิ่มเติมเพิ่มเติมหรือไม่

ไดเร็กทอรีสแตติกและสื่อของฉันอยู่ใน /mainappdjango/static ไม่ใช่ในไดเร็กทอรีราก หากฉันไม่ทำอย่างนั้น แสดงว่าสแตติกของฉันไม่ได้โหลด รูปภาพได้รับการอัปโหลดอย่างดีบนเซิร์ฟเวอร์ (ฉันสามารถเข้าถึงได้ด้วย FTP หรือ SSH)

คุณมีความคิดเกี่ยวกับปัญหาที่ทำให้เกิดข้อผิดพลาด 404 เหล่านี้หรือไม่ :/

ขอบคุณมาก!


person Zoloom    schedule 20.09.2018    source แหล่งที่มา
comment
เส้นทางไปยังภาพสื่อคืออะไรเมื่อคุณดูผ่าน ssh? คุณบอกว่าพวกเขาอยู่ใน /mainappdjango/static/media แต่ nginx กำลังชี้ไปที่ mywebsite/site/media และคุณไม่ควรมี URL สื่อใด ๆ ใน urls.py ของคุณ แอป Django ของคุณไม่ให้บริการไฟล์มีเดีย   -  person dirkgroten    schedule 21.09.2018
comment
ขอบคุณ ฉันลบบรรทัดใน urls.py ของฉันแล้ว นี่คือเส้นทางของฉันบนเซิร์ฟเวอร์ของฉัน ... ~/user/mywebsite/media/CACHE/images/img/venus_kMHza3Y/a154c07683def505960eb63c63ca541e.jpg   -  person Zoloom    schedule 22.09.2018
comment
~ คืออะไร? และทำไมคุณถึงมี /site/ อยู่ระหว่าง mywebsite และสื่อในการตั้งค่า nginx ของคุณ?   -  person dirkgroten    schedule 22.09.2018
comment
นี่คือการส่งคืนเทอร์มินัลของฉัน ดังนั้น ~ จึงเป็นโฮมไดเร็กตอรี่ของฉัน site คือที่ที่เว็บไซต์ของฉันเก็บไว้ ตัวอย่างสคริปต์รูทของฉันในหัวหน้างานคือ: /home/user/mywebsite/site   -  person Zoloom    schedule 22.09.2018
comment
คุณต้องมีเส้นทางแบบเต็มและจำเป็นต้องใช้เส้นทางนั้นกับ nginx   -  person dirkgroten    schedule 22.09.2018
comment
ฉันรู้ ~ คือโฮมไดเร็กตอรี่ของคุณ ฉันกำลังถามว่าเส้นทางของ ~ คืออะไร   -  person dirkgroten    schedule 22.09.2018
comment
นี่คือ /home/user   -  person Zoloom    schedule 22.09.2018
comment
ฉันทำผิดพลาด: ฉันลืมแอป Django หลักในเส้นทาง nginx เพราะฉันย้ายไดเร็กทอรี static+media ของฉันไปไว้ในไดเร็กทอรีแอปหลักของฉัน   -  person Zoloom    schedule 22.09.2018
comment
ถ้าอย่างนั้นเพียงลบ /site/ ในการกำหนดค่า nginx ของคุณออกและมันก็ควรจะตรงกัน ตรวจสอบบันทึก nginx ของคุณด้วยหากยังไม่ทำงาน โดยปกติจะอยู่ใน /var/log/nginx   -  person dirkgroten    schedule 22.09.2018
comment
การวางสื่อไว้ในไดเร็กทอรีแอปของคุณก็เป็นความคิดที่ไม่ดีอยู่แล้ว เพราะโดยปกติแล้วไดเร็กทอรีแอปของคุณจะต้องดึงมาจาก VCS เช่น git และสื่อไม่ได้เป็นส่วนหนึ่งของพื้นที่เก็บข้อมูล   -  person dirkgroten    schedule 22.09.2018
comment
ขออภัย เย็นนี้ฉันคงสมองตายไปแล้ว แต่เส้นทางแบบเต็มของฉันในไดเร็กทอรีสื่อของฉันคือ: /home/user/mywebsite/site/mywebsite/media/ (ฉันได้ลองใช้ซีดี ... บนนั้น ฉันแน่ใจว่า ).   -  person Zoloom    schedule 22.09.2018
comment
ตกลง ฉันควรใช้โครงสร้างไดเรกทอรีใดเพื่อให้มีทรัพยากรทั้งในท้องถิ่นและออนไลน์ เมื่อฉันไม่ได้ใส่ไว้ในไดเรกทอรีย่อยของแอป ฉันจะโหลดเนื้อหาออนไลน์ไม่ได้   -  person Zoloom    schedule 22.09.2018
comment
คำสั่งคือ pwd เพื่อแสดงเส้นทางแบบเต็ม อย่างไรก็ตาม นั่นคือเส้นทางที่ nginx ต้องการ   -  person dirkgroten    schedule 22.09.2018
comment
ขออภัย สำหรับท้องถิ่น คุณจะต้องใช้รูปแบบ URL ที่ฉันบอกให้คุณลบออก ทางที่ดีที่สุดคือห่อด้วย if settings.DEBUG เพื่อไม่ให้ใช้สำหรับการผลิต MEDIA_ROOT ของคุณสามารถอยู่นอกไดเรกทอรีโครงการของคุณได้ ไม่มีปัญหา ใช้งานได้กับท้องถิ่น runserver   -  person dirkgroten    schedule 22.09.2018
comment
ฉันสร้างซีดีในเทอร์มินัลไปยังไดเร็กทอรีสื่อของฉัน และวางสิ่งที่ฉันมีด้วย pwd ให้ตรงกัน สำหรับ Stack ฉันได้เปลี่ยนชื่อผู้ใช้ของฉันไปแล้วและมันก็น่าสับสนขอโทษด้วยฉันต้องทำให้ประเด็น: ไดเรกทอรีรากของฉันใน Nginx คือ: /home/chuck/domi/site/domi ไดเรกทอรีคงที่ของฉันคือ: นามแฝง / หน้าแรก/เชย/domi/ไซต์/domi/static/; ไดเรกทอรีสื่อของฉันคือ: นามแฝง /home/chuck/domi/site/domi/media;   -  person Zoloom    schedule 22.09.2018
comment
ให้เราสนทนาต่อในการแชท   -  person Zoloom    schedule 22.09.2018
comment
เมื่อคุณถามคำถามเกี่ยวกับ SO โปรดตรวจสอบให้แน่ใจว่าคุณได้คัดลอกโค้ดวางและการกำหนดค่า อย่าแก้ไขพวกเขา คุณต้องการให้เราช่วยแก้ไขสิ่งต่าง ๆ อย่างไรหากรหัสที่คุณแสดงไม่ใช่รหัสที่คุณใช้อยู่ ตอนนี้คุณกำลังบอกว่านามแฝงใน nginx นั้นเหมือนกับเส้นทางไปยังสื่อบนเซิร์ฟเวอร์ของคุณทุกประการใช่ไหม จากนั้นดูบันทึก nginx และตรวจสอบข้อผิดพลาดที่นั่น   -  person dirkgroten    schedule 22.09.2018
comment
ขออภัยจริงๆ สำหรับสิ่งนั้น...ฉันตรวจสอบบันทึกของ Nginx แล้ว!   -  person Zoloom    schedule 22.09.2018
comment
2018/09/21 23:40:37 [ข้อผิดพลาด] 1480#1480: *3 open() /home/chuck/domi/site/domi/media/CACHE/images/img/venus_kMHza3Y/a154c07683def505960eb63c63ca541e.jpg ล้มเหลว (2: ไม่มีไฟล์ดังกล่าว [...]   -  person Zoloom    schedule 22.09.2018
comment
ดังนั้นการกำหนดค่าใหม่ของฉันคือ: location /media/ { autoindex on; นามแฝง /home/chuck/domi/site/domi/media/; }   -  person Zoloom    schedule 22.09.2018
comment
ตกลง เข้าใจแล้ว รูปภาพหายไปใน CACHE ฉันคิดว่าการกำหนดค่า GIT ของฉันสามารถอธิบายได้ ดังนั้น...ถึงเวลาทำสิ่งที่ถูกต้อง ฉันจะสร้างโปรเจ็กต์ใหม่ทั้งหมดเพื่อให้มีบางสิ่งที่ชัดเจน ขอบคุณสำหรับความช่วยเหลือของคุณ !!   -  person Zoloom    schedule 22.09.2018


คำตอบ (1)


คุณมีการกำหนดค่า nginx ผิด ต้องเพิ่มน้ำสลัด

location /static/ {
    alias /home/user/mywebsite/site/static/;
    autoindex on;
}
location /media/{
  alias /home/user/mywebsite/site/media/;
  autoindex on;
}
person aman kumar    schedule 20.09.2018
comment
ขอบคุณสำหรับคำตอบของคุณ แต่ยังคงส่งคืน 404 :'( - person Zoloom; 20.09.2018
comment
BTW จำเป็นต้องมี '^' หรือไม่ - person Zoloom; 20.09.2018
comment
ฉันควรสร้างรายการ Nginx สำหรับแคชหรือไม่ - person Zoloom; 20.09.2018
comment
คุณสามารถตรวจสอบเส้นทางนี้บนเซิร์ฟเวอร์ /home/user/mywebsite/site/media/CACHE/images/img/venus/758c9f7d70d0c64b5631cc865986de48.jpg สิ่งนี้มีอยู่หรือไม่ - person aman kumar; 21.09.2018
comment
มันมีอยู่ :/ ปัญหานี้ไม่สมเหตุสมผลสำหรับฉัน - person Zoloom; 21.09.2018
comment
คุณลองลบ ^ ใน nginx ได้ไหม - person aman kumar; 21.09.2018
comment
นั่นไม่มีอะไรเปลี่ยนแปลง :/ - person Zoloom; 21.09.2018