рд╕реНрдЯреИрдЯрд┐рд╕реНрдЯрд┐рдХрдирд░ рдкреНрд░реЛ

рдЬреЗрд░реЗрдб рдХреБрдУрд▓рдЯ рдиреЗ Django рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рдХреИрдЪрд┐рдВрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ рд╣реИред рд╕рднреА рдХреЗ рд▓рд┐рдП рдЙрд▓реНрд▓реЗрдЦрдиреАрдп: рд╕рд╛рджрдЧреА рдФрд░ рдЖрдХрд╛рд░ рджреЛрдиреЛрдВред



рд▓реЗрдХрд┐рди рдЬреЗрд░реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕реНрдЯреИрдЯрд┐рд╕реНрдЯрд┐рдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдиреЗрдЧрдиреЗрдХреНрд╕ рдХреЙрдиреНрдлрд┐рдЧ рдореЗрдВ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:

1) рдХреЗрд╡рд▓ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ;

2) рдХреЗрд╡рд▓ рдПрдХ рд╕рд░рд▓ рд░реВрдк рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ;

3) рдкреАрдврд╝реА рдХреЗрд╡рд▓ рддрднреА рдЬрдм / рд╕рд╛рдордЧреНрд░реА рдФрд░ / рдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝ / рдмрджрд▓ рд░рд╣реА рд╣реЛрдВред



рдореИрдВрдиреЗ рдЗрди рдХрдорд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЬреЛрдбрд╝рд╛, рдФрд░ рдореБрдЭреЗ рд╕реНрдЯреИрдЯрд┐рдХрдирд░рдирд░ рдкреНрд░реЛ рдорд┐рд▓рд╛ред



рдЗрд╕рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
  1. рдЕрдирд╛рдо рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реА рдХреИрд╢рд┐рдВрдЧ

    рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реЛрдз, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрд╢рд╛ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛, рд╕реАрдзреЗ Django рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, StaticGenerator рдкреНрд░реЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреБрдордирд╛рдореА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ (рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдЙрдирдореЗрдВ рд╕реЗ 99% рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ)ред



    рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рди рдХреЗрд╡рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдирдЧреНрдиреЗрдХреНрд╕-рдИ рдореЗрдВ рднреА рд╣реЛрддреА рд╣реИ (рдпрд╣ рдХреБрдХреАрдЬрд╝ рдореЗрдВ рд╕реЗрд╢рдирд┐рдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ)ред

    рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдирд░реЗрдЯрд░ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдирдЧреАрдирдХреНрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред



    рдЕрдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЕрдирд╛рдо рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд nginx config рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ (рдЕрдкрд╛рдЪреЗ рдмреИрдХреЗрдВрдб рдХреЗ рдмрдЬрд╛рдп, Django рдореЗрд░реЗ рд▓рд┐рдП fcgi рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ): http {

    # [here must be all standard parameters]

    server {

    server_name example.com;

    listen 80;

    root /home/mydjangoproject/www;



    # django

    set $django 1;



    # ,

    #

    if ($is_args = "?") {

    set $args_old ?$args;

    }

    if ($is_args = "") {

    set $args_old "";

    }



    # ,

    #

    default_type text/html;



    location / {

    if (-f $request_filename/index.html$args_old) {

    set $django 0;

    }



    #

    if ($http_cookie ~* "sessionid=([^;]+)(?:;|$)" ) {

    set $django 1;

    }



    #

    if ($django = 0) {

    rewrite (.*) $1/index.html$args_old break;

    }



    # django

    if ($django) {

    fastcgi_pass unix:/home/mydjangoproject/dj.sock;

    break;

    }



    index index.html;

    include conf/fastcgi.conf;

    access_log logs/project.log main;

    }

    }

    }





    http {

    # [here must be all standard parameters]

    server {

    server_name example.com;

    listen 80;

    root /home/mydjangoproject/www;



    # django

    set $django 1;



    # ,

    #

    if ($is_args = "?") {

    set $args_old ?$args;

    }

    if ($is_args = "") {

    set $args_old "";

    }



    # ,

    #

    default_type text/html;



    location / {

    if (-f $request_filename/index.html$args_old) {

    set $django 0;

    }



    #

    if ($http_cookie ~* "sessionid=([^;]+)(?:;|$)" ) {

    set $django 1;

    }



    #

    if ($django = 0) {

    rewrite (.*) $1/index.html$args_old break;

    }



    # django

    if ($django) {

    fastcgi_pass unix:/home/mydjangoproject/dj.sock;

    break;

    }



    index index.html;

    include conf/fastcgi.conf;

    access_log logs/project.log main;

    }

    }

    }







    рдПрдХ рдФрд░ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛:

    nginx рд▓реЙрдЧ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрдЬ рдХреИрд╢ рд╕реЗ рдпрд╛ django рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЙрдЧ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ $ django рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

    log_format main '$remote_addr [$time_local] "$request" '

    '$status $bytes_sent $body_bytes_sent $gzip_ratio '

    '$django "$http_referer" "$http_user_agent"';







    рд▓реЙрдЧ рдореЗрдВ

    0 - рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреЗрдЬ (рдХреИрд╢)

    1 - django рд╕реЗ fcgi рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЗрдЬ

  2. рдорд┐рдбрд┐рд▓рд╡реЗрдпрд░ , рдЬреЛ рдкрд╣рд▓реЗ рдПрдХреНрд╕реЗрд╕ рдкрд░ рд╕реНрдЯреИрдЯрд┐рдХ рдлрд╛рдЗрд▓реНрд╕ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдмрд╛рдж рдХреЗ рд╕рднреА рдХреИрд╢ рд╕реЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

    рд╕реНрдЯреЗрдЯрд┐рдХ рдлрд╛рдЗрд▓реЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ (рдХреЛрдб 200) рдФрд░ рдЯрд╛рдЗрдк GET рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред



    рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдЬрдирд░реЗрдЯрд░рдкреНрд░реВрдл рдХреЛ рдЬрдЧрд╣ рджреЗрдВ

    рдФрд░ рд╕реЗрдЯрд┐рдВрдЧ 'Oracle.ResponseStaticGenerator' рдореЗрдВ MIDDLEWARE_CLASSES рдЬреЛрдбрд╝реЗрдВред

    рд╡рд╣рд╛рдВ www рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрде рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред

    from os import path

    WEB_ROOT = path.realpath("www")







    рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреИрд╢ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

  3. рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ , рдЬреИрд╕реЗ www.alrond.com/?test=1

    рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  4. рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЬрд┐рди рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдХреИрд╢рд┐рдВрдЧ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдирдХреА рд╢реБрд░реБрдЖрдд рд╕реЗрдЯ рдХрд░реЗрдВ :

    STATIC_GENERATOR_EXCLUDED = (

    '/comments/postfree',

    '/rating',

    '/rss',

    '/admin',

    )






    рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, / рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ / рдкреЛрд╕реНрдЯрдлреНрд░реА, рд░реЗрдЯрд┐рдВрдЧ, / рдЖрд░рдПрд╕рдПрд╕, / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред



    рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдЕрдиреВрдареЗ рдбреЗрдЯрд╛ рдХреЛ рдЕрдирд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрди рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рднреА рдХреЗрд╡рд▓ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  5. рдЪрд╛рд▓рд╛рдХ рдХреИрд╢ рдбрд┐рд▓реАрдЯ

    рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрде рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкрд╣рд▓реЗ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ)ред



    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, http://www.alrond.com/en/index.html рд╣рдЯрд╛рдиреЗ рд╕реЗ http://www.alrond.com/en/index.html?test=1 рдФрд░ http://www.alrond.com/ рд╣рдЯ рдЬрд╛рдПрдВрдЧреЗ ред en / index.html? tag = django & sort = desc
  6. рд╡рд┐рдЪрд╛рд░реЛрдВ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдХреИрд╢ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛

    рдХрд┐рд╕реА рднреА рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд░рд┐рдЯрд░реНрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд╣рд▓реЗ [[DisableStaticGenerator]] = 1 рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╣рд╛рди рдХрд╛рдо рдХрд░рддреА рд╣реИ: рдореЗрд░рд╛ рдмреНрд▓реЙрдЧ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдШрд░ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ 14.2 рдкреАрдкреАрдПрдо рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде 7500 рдкреАрдкреАрдПрдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ 530 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ!



рдбрд╛рдЙрдирд▓реЛрдб StaticGenerator рдкреНрд░реЛ рдпрд╣рд╛рдБ ред рдЕрдВрддрд░ рдЬреЛрдбрд╝рд╛ ResponseStaticGenerator рд╡рд░реНрдЧ рдФрд░ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд delete_from_path рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИ



рдореВрд▓ рд▓реЗрдЦ: www.alrond.com/en/2008/feb/23/static-generator-pro



All Articles