33

I have django installed on IIS8. Now I want to configure it to serve static files. I have been following this tutorial

I have added this to settings.py

STATIC_URL = '/static/'

STATIC_ROOT = 'C:/my_django_project/NZtracker/static_for_production/'

STATICFILES_DIRS = ( 'C:/my_django_project/NZtracker/static/', )

and then run collectstatic.

As a result, all the static folders have been moved to C:/my_django_project/NZtracker/static_for_production/.

Next, I was trying to configure IIS to serve files from that folder but couldn't. (I have tried following this post, but it also did not work)

How can I fix it? Thanks

0

2 Answers 2

64

After struggling for 2 days, for the sake of those who have the same problem, I wanted to share a step-by-step solution for this (probably common) issue.

Problem

You have started a Django project on IIS, and it is working perfectly on your localhost. Now, when deploying it to a web server, the static files (CSS, JS, images,..) are not fetched. You can read here and here, but in fact, you don't want all these configurations and copying files from one directory to another...

What you want is for your IIS server to fetch the static files from the static/ directory, just as the development server (the one you run with python manage.py runserver) did. enter image description here

Solution

  1. inside the static/ directory, create a new file called web.config (notice, you probably have another web.config file in an upper directory - don't touch it. Just leave it as is). enter image description here

  2. Write the following as the content of this file:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <!-- this configuration overrides the FastCGI handler to let IIS serve the static files -->
    <handlers>
    <clear/>
      <add name="StaticFile" path="*" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
    </handlers>
  </system.webServer>
</configuration>
  1. Go to your IIS server -> right click the site name -> Add virtual directory. enter image description here

  2. In "Alias" write "static" (This is a MUST). Then, navigate to the folder in the project where all the static files are.

enter image description here

  1. Run IIS server and enter your website. It should work.
Sign up to request clarification or add additional context in comments.

7 Comments

Thank you. I was struggling with this issue and thanks to you I fixed it. I agree with you that this site is too aggressive against new people. Sometimes one can read the documentation and still not be able to fix the problem. And isn't this site about helping one another? If you are going to answer me that I should read documentation, I wouldn't bother to ask in the first place. Again @Yura, thank you for this.
Also good for flask! Thanks for persisting, not getting run out by the ogres, and providing a clear solid answer so I didn't have to spend two days figuring this out.
Thanks. I also had to enable the StaticFileModule via Windows Features, see stackoverflow.com/questions/16644810/…
I found this virtual directory method in many articles. But didn't work for me. I got: This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag with overrideMode="Deny" or the legacy allowOverride="false". Lucas's answer worked for me.
Is there supposed to be text after "2.Write the following as the content of this file:"? I'm struggling with this exact same issue but I'm using HttpPlatform handler instead of FastCGI.
|
25

Yura's answer is quite complete. I had another approach, thought.

Right click the website and go to add application, enter the alias(used 'static') and then enter the physical path to your static files folder. Press OK.
Now, the tricky part, in the application you created for the static folder, go to the handle mapping and delete the mapping to the FastCGI site handler. Enter your site, it works!

It's pretty similar to Yura's answer, but uses the IIS interface instead of writing a web.config file by yourself.

4 Comments

This worked perfectly for me without having to set up a new web.config file.
Thank you @Lucas. This worked perfectly with Python 3.6.6, Django 2.2.7 and Internet Information Services (IIS) 10.0. The above solution using a web.config file did not work.
Works for me. By adding just the virtual directory, or even this one before removing FastCGI handler, the request was going to Django urls.py in which there was no entry for static. As soon as I removed FastCGI handler it worked.
I added virtual directory and but Removing FastCgiModule gives below error "HTTP Error 404.4 - Not Found The resource you are looking for does not have a handler associated with it"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.