zoukankan      html  css  js  c++  java
  • csrf中间件

    csrf :django中的跨站请求伪造的保护机制

    from django.shortcuts import render
    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    from django.views import View
    from django.utils.decorators import method_decorator
    
    
    # @csrf_exempt #当前视图不在进行csrf校验
    # @csrf_protect  #当前视图要进行csrf校验
    def home(request):
        return render(request, 'home.html')
    
    # CBV 添加装饰器
    class Home(View):
        @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            ret = super().dispatch(request, *args, **kwargs)
            return ret
    
        def get(self, request):
            return render(request, 'home.html')
    
        def post(self, request):
            return render(request, 'home.html')

    跨站请求伪造保护机制原理

    from django.middleware.csrf import CsrfViewMiddleware # Ctrl+左键查看源码
    """
    Cross Site Request Forgery Middleware.
    
    This module provides a middleware that implements protection
    against request forgeries from other sites.
    """
    from __future__ import unicode_literals
    
    import logging
    import re
    import string
    
    from django.conf import settings
    from django.core.exceptions import ImproperlyConfigured
    from django.urls import get_callable
    from django.utils.cache import patch_vary_headers
    from django.utils.crypto import constant_time_compare, get_random_string
    from django.utils.deprecation import MiddlewareMixin
    from django.utils.encoding import force_text
    from django.utils.http import is_same_domain
    from django.utils.six.moves import zip
    from django.utils.six.moves.urllib.parse import urlparse
    
    logger = logging.getLogger('django.security.csrf')
    
    REASON_NO_REFERER = "Referer checking failed - no Referer."
    REASON_BAD_REFERER = "Referer checking failed - %s does not match any trusted origins."
    REASON_NO_CSRF_COOKIE = "CSRF cookie not set."
    REASON_BAD_TOKEN = "CSRF token missing or incorrect."
    REASON_MALFORMED_REFERER = "Referer checking failed - Referer is malformed."
    REASON_INSECURE_REFERER = "Referer checking failed - Referer is insecure while host is secure."
    
    CSRF_SECRET_LENGTH = 32
    CSRF_TOKEN_LENGTH = 2 * CSRF_SECRET_LENGTH
    CSRF_ALLOWED_CHARS = string.ascii_letters + string.digits
    CSRF_SESSION_KEY = '_csrftoken'
    
    
    def _get_failure_view():
        """
        Returns the view to be used for CSRF rejections
        """
        return get_callable(settings.CSRF_FAILURE_VIEW)
    
    
    def _get_new_csrf_string():
        return get_random_string(CSRF_SECRET_LENGTH, allowed_chars=CSRF_ALLOWED_CHARS)
    
    
    def _salt_cipher_secret(secret):
        """
        Given a secret (assumed to be a string of CSRF_ALLOWED_CHARS), generate a
        token by adding a salt and using it to encrypt the secret.
        """
        salt = _get_new_csrf_string()
        chars = CSRF_ALLOWED_CHARS
        pairs = zip((chars.index(x) for x in secret), (chars.index(x) for x in salt))
        cipher = ''.join(chars[(x + y) % len(chars)] for x, y in pairs)
        return salt + cipher
    
    
    def _unsalt_cipher_token(token):
        """
        Given a token (assumed to be a string of CSRF_ALLOWED_CHARS, of length
        CSRF_TOKEN_LENGTH, and that its first half is a salt), use it to decrypt
        the second half to produce the original secret.
        """
        salt = token[:CSRF_SECRET_LENGTH]
        token = token[CSRF_SECRET_LENGTH:]
        chars = CSRF_ALLOWED_CHARS
        pairs = zip((chars.index(x) for x in token), (chars.index(x) for x in salt))
        secret = ''.join(chars[x - y] for x, y in pairs)  # Note negative values are ok
        return secret
    
    
    def _get_new_csrf_token():
        return _salt_cipher_secret(_get_new_csrf_string())
    
    
    def get_token(request):
        """
        Returns the CSRF token required for a POST form. The token is an
        alphanumeric value. A new token is created if one is not already set.
    
        A side effect of calling this function is to make the csrf_protect
        decorator and the CsrfViewMiddleware add a CSRF cookie and a 'Vary: Cookie'
        header to the outgoing response.  For this reason, you may need to use this
        function lazily, as is done by the csrf context processor.
        """
        if "CSRF_COOKIE" not in request.META:
            csrf_secret = _get_new_csrf_string()
            request.META["CSRF_COOKIE"] = _salt_cipher_secret(csrf_secret)
        else:
            csrf_secret = _unsalt_cipher_token(request.META["CSRF_COOKIE"])
        request.META["CSRF_COOKIE_USED"] = True
        return _salt_cipher_secret(csrf_secret)
    
    
    def rotate_token(request):
        """
        Changes the CSRF token in use for a request - should be done on login
        for security purposes.
        """
        request.META.update({
            "CSRF_COOKIE_USED": True,
            "CSRF_COOKIE": _get_new_csrf_token(),
        })
        request.csrf_cookie_needs_reset = True
    
    
    def _sanitize_token(token):
        # Allow only ASCII alphanumerics
        if re.search('[^a-zA-Z0-9]', force_text(token)):
            return _get_new_csrf_token()
        elif len(token) == CSRF_TOKEN_LENGTH:
            return token
        elif len(token) == CSRF_SECRET_LENGTH:
            # Older Django versions set cookies to values of CSRF_SECRET_LENGTH
            # alphanumeric characters. For backwards compatibility, accept
            # such values as unsalted secrets.
            # It's easier to salt here and be consistent later, rather than add
            # different code paths in the checks, although that might be a tad more
            # efficient.
            return _salt_cipher_secret(token)
        return _get_new_csrf_token()
    
    
    def _compare_salted_tokens(request_csrf_token, csrf_token):
        # Assume both arguments are sanitized -- that is, strings of
        # length CSRF_TOKEN_LENGTH, all CSRF_ALLOWED_CHARS.
        return constant_time_compare(
            _unsalt_cipher_token(request_csrf_token),
            _unsalt_cipher_token(csrf_token),
        )
    
    
    class CsrfViewMiddleware(MiddlewareMixin):
        """
        Middleware that requires a present and correct csrfmiddlewaretoken
        for POST requests that have a CSRF cookie, and sets an outgoing
        CSRF cookie.
    
        This middleware should be used in conjunction with the csrf_token template
        tag.
        """
        # The _accept and _reject methods currently only exist for the sake of the
        # requires_csrf_token decorator.
        def _accept(self, request):
            # Avoid checking the request twice by adding a custom attribute to
            # request.  This will be relevant when both decorator and middleware
            # are used.
            request.csrf_processing_done = True
            return None
    
        def _reject(self, request, reason):
            logger.warning(
                'Forbidden (%s): %s', reason, request.path,
                extra={
                    'status_code': 403,
                    'request': request,
                }
            )
            return _get_failure_view()(request, reason=reason)
    
        def _get_token(self, request):
            if settings.CSRF_USE_SESSIONS:
                try:
                    return request.session.get(CSRF_SESSION_KEY)
                except AttributeError:
                    raise ImproperlyConfigured(
                        'CSRF_USE_SESSIONS is enabled, but request.session is not '
                        'set. SessionMiddleware must appear before CsrfViewMiddleware '
                        'in MIDDLEWARE%s.' % ('_CLASSES' if settings.MIDDLEWARE is None else '')
                    )
            else:
                try:
                    cookie_token = request.COOKIES[settings.CSRF_COOKIE_NAME]
                except KeyError:
                    return None
    
                csrf_token = _sanitize_token(cookie_token)
                if csrf_token != cookie_token:
                    # Cookie token needed to be replaced;
                    # the cookie needs to be reset.
                    request.csrf_cookie_needs_reset = True
                return csrf_token
    
        def _set_token(self, request, response):
            if settings.CSRF_USE_SESSIONS:
                request.session[CSRF_SESSION_KEY] = request.META['CSRF_COOKIE']
            else:
                response.set_cookie(
                    settings.CSRF_COOKIE_NAME,
                    request.META['CSRF_COOKIE'],
                    max_age=settings.CSRF_COOKIE_AGE,
                    domain=settings.CSRF_COOKIE_DOMAIN,
                    path=settings.CSRF_COOKIE_PATH,
                    secure=settings.CSRF_COOKIE_SECURE,
                    httponly=settings.CSRF_COOKIE_HTTPONLY,
                )
                # Set the Vary header since content varies with the CSRF cookie.
                patch_vary_headers(response, ('Cookie',))
    
        def process_request(self, request):
            csrf_token = self._get_token(request)
            if csrf_token is not None:
                # Use same token next time.
                request.META['CSRF_COOKIE'] = csrf_token
    
        def process_view(self, request, callback, callback_args, callback_kwargs):
            if getattr(request, 'csrf_processing_done', False):
                return None
    
            # Wait until request.META["CSRF_COOKIE"] has been manipulated before
            # bailing out, so that get_token still works
            if getattr(callback, 'csrf_exempt', False):
                return None
    
            # Assume that anything not defined as 'safe' by RFC7231 needs protection
            if request.method not in ('GET', 'HEAD', 'OPTIONS', 'TRACE'):
                if getattr(request, '_dont_enforce_csrf_checks', False):
                    # Mechanism to turn off CSRF checks for test suite.
                    # It comes after the creation of CSRF cookies, so that
                    # everything else continues to work exactly the same
                    # (e.g. cookies are sent, etc.), but before any
                    # branches that call reject().
                    return self._accept(request)
    
                if request.is_secure():
                    # Suppose user visits http://example.com/
                    # An active network attacker (man-in-the-middle, MITM) sends a
                    # POST form that targets https://example.com/detonate-bomb/ and
                    # submits it via JavaScript.
                    #
                    # The attacker will need to provide a CSRF cookie and token, but
                    # that's no problem for a MITM and the session-independent
                    # secret we're using. So the MITM can circumvent the CSRF
                    # protection. This is true for any HTTP connection, but anyone
                    # using HTTPS expects better! For this reason, for
                    # https://example.com/ we need additional protection that treats
                    # http://example.com/ as completely untrusted. Under HTTPS,
                    # Barth et al. found that the Referer header is missing for
                    # same-domain requests in only about 0.2% of cases or less, so
                    # we can use strict Referer checking.
                    referer = force_text(
                        request.META.get('HTTP_REFERER'),
                        strings_only=True,
                        errors='replace'
                    )
                    if referer is None:
                        return self._reject(request, REASON_NO_REFERER)
    
                    referer = urlparse(referer)
    
                    # Make sure we have a valid URL for Referer.
                    if '' in (referer.scheme, referer.netloc):
                        return self._reject(request, REASON_MALFORMED_REFERER)
    
                    # Ensure that our Referer is also secure.
                    if referer.scheme != 'https':
                        return self._reject(request, REASON_INSECURE_REFERER)
    
                    # If there isn't a CSRF_COOKIE_DOMAIN, require an exact match
                    # match on host:port. If not, obey the cookie rules (or those
                    # for the session cookie, if CSRF_USE_SESSIONS).
                    good_referer = (
                        settings.SESSION_COOKIE_DOMAIN
                        if settings.CSRF_USE_SESSIONS
                        else settings.CSRF_COOKIE_DOMAIN
                    )
                    if good_referer is not None:
                        server_port = request.get_port()
                        if server_port not in ('443', '80'):
                            good_referer = '%s:%s' % (good_referer, server_port)
                    else:
                        # request.get_host() includes the port.
                        good_referer = request.get_host()
    
                    # Here we generate a list of all acceptable HTTP referers,
                    # including the current host since that has been validated
                    # upstream.
                    good_hosts = list(settings.CSRF_TRUSTED_ORIGINS)
                    good_hosts.append(good_referer)
    
                    if not any(is_same_domain(referer.netloc, host) for host in good_hosts):
                        reason = REASON_BAD_REFERER % referer.geturl()
                        return self._reject(request, reason)
    
                csrf_token = request.META.get('CSRF_COOKIE')
                if csrf_token is None:
                    # No CSRF cookie. For POST requests, we insist on a CSRF cookie,
                    # and in this way we can avoid all CSRF attacks, including login
                    # CSRF.
                    return self._reject(request, REASON_NO_CSRF_COOKIE)
    
                # Check non-cookie token for match.
                request_csrf_token = ""
                if request.method == "POST":
                    try:
                        request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
                    except IOError:
                        # Handle a broken connection before we've completed reading
                        # the POST data. process_view shouldn't raise any
                        # exceptions, so we'll ignore and serve the user a 403
                        # (assuming they're still listening, which they probably
                        # aren't because of the error).
                        pass
    
                if request_csrf_token == "":
                    # Fall back to X-CSRFToken, to make things easier for AJAX,
                    # and possible for PUT/DELETE.
                    request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '')
    
                request_csrf_token = _sanitize_token(request_csrf_token)
                if not _compare_salted_tokens(request_csrf_token, csrf_token):
                    return self._reject(request, REASON_BAD_TOKEN)
    
            return self._accept(request)
    
        def process_response(self, request, response):
            if not getattr(request, 'csrf_cookie_needs_reset', False):
                if getattr(response, 'csrf_cookie_set', False):
                    return response
    
            if not request.META.get("CSRF_COOKIE_USED", False):
                return response
    
            # Set the CSRF cookie even if it's already set, so we renew
            # the expiry timer.
            self._set_token(request, response)
            response.csrf_cookie_set = True
            return response
    csrf.py

    process_request

     def process_request(self, request):
            csrf_token = self._get_token(request)
            if csrf_token is not None:
                # Use same token next time.
                request.META['CSRF_COOKIE'] = csrf_token

    process_request 调用了 _get_token 方法

     def _get_token(self, request):
            if settings.CSRF_USE_SESSIONS:
                try:
                    return request.session.get(CSRF_SESSION_KEY)
                except AttributeError:
                    raise ImproperlyConfigured(
                        'CSRF_USE_SESSIONS is enabled, but request.session is not '
                        'set. SessionMiddleware must appear before CsrfViewMiddleware '
                        'in MIDDLEWARE%s.' % ('_CLASSES' if settings.MIDDLEWARE is None else '')
                    )
            else:
                try:
                    cookie_token = request.COOKIES[settings.CSRF_COOKIE_NAME] #全局变量中546行
                except KeyError:
                    return None
    
                csrf_token = _sanitize_token(cookie_token)  #cookie 中获取crsftoken的值
                if csrf_token != cookie_token:
                    # Cookie token needed to be replaced;
                    # the cookie needs to be reset.
                    request.csrf_cookie_needs_reset = True
                return csrf_token

    查看django全局配置

    from django.conf import global_settings
    # -*- coding: utf-8 -*-
    """
    Default Django settings. Override these with settings in the module pointed to
    by the DJANGO_SETTINGS_MODULE environment variable.
    """
    from __future__ import unicode_literals
    
    
    # This is defined here as a do-nothing function because we can't import
    # django.utils.translation -- that module depends on the settings.
    def gettext_noop(s):
        return s
    
    
    ####################
    # CORE             #
    ####################
    
    DEBUG = False
    
    # Whether the framework should propagate raw exceptions rather than catching
    # them. This is useful under some testing situations and should never be used
    # on a live site.
    DEBUG_PROPAGATE_EXCEPTIONS = False
    
    # Whether to use the "ETag" header. This saves bandwidth but slows down performance.
    # Deprecated (RemovedInDjango21Warning) in favor of ConditionalGetMiddleware
    # which sets the ETag regardless of this setting.
    USE_ETAGS = False
    
    # People who get code error notifications.
    # In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')]
    ADMINS = []
    
    # List of IP addresses, as strings, that:
    #   * See debug comments, when DEBUG is true
    #   * Receive x-headers
    INTERNAL_IPS = []
    
    # Hosts/domain names that are valid for this site.
    # "*" matches anything, ".example.com" matches example.com and all subdomains
    ALLOWED_HOSTS = []
    
    # Local time zone for this installation. All choices can be found here:
    # https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all
    # systems may support all possibilities). When USE_TZ is True, this is
    # interpreted as the default user time zone.
    TIME_ZONE = 'America/Chicago'
    
    # If you set this to True, Django will use timezone-aware datetimes.
    USE_TZ = False
    
    # Language code for this installation. All choices can be found here:
    # http://www.i18nguy.com/unicode/language-identifiers.html
    LANGUAGE_CODE = 'en-us'
    
    # Languages we provide translations for, out of the box.
    LANGUAGES = [
        ('af', gettext_noop('Afrikaans')),
        ('ar', gettext_noop('Arabic')),
        ('ast', gettext_noop('Asturian')),
        ('az', gettext_noop('Azerbaijani')),
        ('bg', gettext_noop('Bulgarian')),
        ('be', gettext_noop('Belarusian')),
        ('bn', gettext_noop('Bengali')),
        ('br', gettext_noop('Breton')),
        ('bs', gettext_noop('Bosnian')),
        ('ca', gettext_noop('Catalan')),
        ('cs', gettext_noop('Czech')),
        ('cy', gettext_noop('Welsh')),
        ('da', gettext_noop('Danish')),
        ('de', gettext_noop('German')),
        ('dsb', gettext_noop('Lower Sorbian')),
        ('el', gettext_noop('Greek')),
        ('en', gettext_noop('English')),
        ('en-au', gettext_noop('Australian English')),
        ('en-gb', gettext_noop('British English')),
        ('eo', gettext_noop('Esperanto')),
        ('es', gettext_noop('Spanish')),
        ('es-ar', gettext_noop('Argentinian Spanish')),
        ('es-co', gettext_noop('Colombian Spanish')),
        ('es-mx', gettext_noop('Mexican Spanish')),
        ('es-ni', gettext_noop('Nicaraguan Spanish')),
        ('es-ve', gettext_noop('Venezuelan Spanish')),
        ('et', gettext_noop('Estonian')),
        ('eu', gettext_noop('Basque')),
        ('fa', gettext_noop('Persian')),
        ('fi', gettext_noop('Finnish')),
        ('fr', gettext_noop('French')),
        ('fy', gettext_noop('Frisian')),
        ('ga', gettext_noop('Irish')),
        ('gd', gettext_noop('Scottish Gaelic')),
        ('gl', gettext_noop('Galician')),
        ('he', gettext_noop('Hebrew')),
        ('hi', gettext_noop('Hindi')),
        ('hr', gettext_noop('Croatian')),
        ('hsb', gettext_noop('Upper Sorbian')),
        ('hu', gettext_noop('Hungarian')),
        ('ia', gettext_noop('Interlingua')),
        ('id', gettext_noop('Indonesian')),
        ('io', gettext_noop('Ido')),
        ('is', gettext_noop('Icelandic')),
        ('it', gettext_noop('Italian')),
        ('ja', gettext_noop('Japanese')),
        ('ka', gettext_noop('Georgian')),
        ('kk', gettext_noop('Kazakh')),
        ('km', gettext_noop('Khmer')),
        ('kn', gettext_noop('Kannada')),
        ('ko', gettext_noop('Korean')),
        ('lb', gettext_noop('Luxembourgish')),
        ('lt', gettext_noop('Lithuanian')),
        ('lv', gettext_noop('Latvian')),
        ('mk', gettext_noop('Macedonian')),
        ('ml', gettext_noop('Malayalam')),
        ('mn', gettext_noop('Mongolian')),
        ('mr', gettext_noop('Marathi')),
        ('my', gettext_noop('Burmese')),
        ('nb', gettext_noop('Norwegian Bokmål')),
        ('ne', gettext_noop('Nepali')),
        ('nl', gettext_noop('Dutch')),
        ('nn', gettext_noop('Norwegian Nynorsk')),
        ('os', gettext_noop('Ossetic')),
        ('pa', gettext_noop('Punjabi')),
        ('pl', gettext_noop('Polish')),
        ('pt', gettext_noop('Portuguese')),
        ('pt-br', gettext_noop('Brazilian Portuguese')),
        ('ro', gettext_noop('Romanian')),
        ('ru', gettext_noop('Russian')),
        ('sk', gettext_noop('Slovak')),
        ('sl', gettext_noop('Slovenian')),
        ('sq', gettext_noop('Albanian')),
        ('sr', gettext_noop('Serbian')),
        ('sr-latn', gettext_noop('Serbian Latin')),
        ('sv', gettext_noop('Swedish')),
        ('sw', gettext_noop('Swahili')),
        ('ta', gettext_noop('Tamil')),
        ('te', gettext_noop('Telugu')),
        ('th', gettext_noop('Thai')),
        ('tr', gettext_noop('Turkish')),
        ('tt', gettext_noop('Tatar')),
        ('udm', gettext_noop('Udmurt')),
        ('uk', gettext_noop('Ukrainian')),
        ('ur', gettext_noop('Urdu')),
        ('vi', gettext_noop('Vietnamese')),
        ('zh-hans', gettext_noop('Simplified Chinese')),
        ('zh-hant', gettext_noop('Traditional Chinese')),
    ]
    
    # Languages using BiDi (right-to-left) layout
    LANGUAGES_BIDI = ["he", "ar", "fa", "ur"]
    
    # If you set this to False, Django will make some optimizations so as not
    # to load the internationalization machinery.
    USE_I18N = True
    LOCALE_PATHS = []
    
    # Settings for language cookie
    LANGUAGE_COOKIE_NAME = 'django_language'
    LANGUAGE_COOKIE_AGE = None
    LANGUAGE_COOKIE_DOMAIN = None
    LANGUAGE_COOKIE_PATH = '/'
    
    
    # If you set this to True, Django will format dates, numbers and calendars
    # according to user current locale.
    USE_L10N = False
    
    # Not-necessarily-technical managers of the site. They get broken link
    # notifications and other various emails.
    MANAGERS = ADMINS
    
    # Default content type and charset to use for all HttpResponse objects, if a
    # MIME type isn't manually specified. These are used to construct the
    # Content-Type header.
    DEFAULT_CONTENT_TYPE = 'text/html'
    DEFAULT_CHARSET = 'utf-8'
    
    # Encoding of files read from disk (template and initial SQL files).
    FILE_CHARSET = 'utf-8'
    
    # Email address that error messages come from.
    SERVER_EMAIL = 'root@localhost'
    
    # Database connection info. If left empty, will default to the dummy backend.
    DATABASES = {}
    
    # Classes used to implement DB routing behavior.
    DATABASE_ROUTERS = []
    
    # The email backend to use. For possible shortcuts see django.core.mail.
    # The default is to use the SMTP backend.
    # Third-party backends can be specified by providing a Python path
    # to a module that defines an EmailBackend class.
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    
    # Host for sending email.
    EMAIL_HOST = 'localhost'
    
    # Port for sending email.
    EMAIL_PORT = 25
    
    # Whether to send SMTP 'Date' header in the local time zone or in UTC.
    EMAIL_USE_LOCALTIME = False
    
    # Optional SMTP authentication information for EMAIL_HOST.
    EMAIL_HOST_USER = ''
    EMAIL_HOST_PASSWORD = ''
    EMAIL_USE_TLS = False
    EMAIL_USE_SSL = False
    EMAIL_SSL_CERTFILE = None
    EMAIL_SSL_KEYFILE = None
    EMAIL_TIMEOUT = None
    
    # List of strings representing installed apps.
    INSTALLED_APPS = []
    
    TEMPLATES = []
    
    # Default form rendering class.
    FORM_RENDERER = 'django.forms.renderers.DjangoTemplates'
    
    # Default email address to use for various automated correspondence from
    # the site managers.
    DEFAULT_FROM_EMAIL = 'webmaster@localhost'
    
    # Subject-line prefix for email messages send with django.core.mail.mail_admins
    # or ...mail_managers.  Make sure to include the trailing space.
    EMAIL_SUBJECT_PREFIX = '[Django] '
    
    # Whether to append trailing slashes to URLs.
    APPEND_SLASH = True
    
    # Whether to prepend the "www." subdomain to URLs that don't have it.
    PREPEND_WWW = False
    
    # Override the server-derived value of SCRIPT_NAME
    FORCE_SCRIPT_NAME = None
    
    # List of compiled regular expression objects representing User-Agent strings
    # that are not allowed to visit any page, systemwide. Use this for bad
    # robots/crawlers. Here are a few examples:
    #     import re
    #     DISALLOWED_USER_AGENTS = [
    #         re.compile(r'^NaverBot.*'),
    #         re.compile(r'^EmailSiphon.*'),
    #         re.compile(r'^SiteSucker.*'),
    #         re.compile(r'^sohu-search'),
    #     ]
    DISALLOWED_USER_AGENTS = []
    
    ABSOLUTE_URL_OVERRIDES = {}
    
    # List of compiled regular expression objects representing URLs that need not
    # be reported by BrokenLinkEmailsMiddleware. Here are a few examples:
    #    import re
    #    IGNORABLE_404_URLS = [
    #        re.compile(r'^/apple-touch-icon.*.png$'),
    #        re.compile(r'^/favicon.ico$'),
    #        re.compile(r'^/robots.txt$'),
    #        re.compile(r'^/phpmyadmin/'),
    #        re.compile(r'.(cgi|php|pl)$'),
    #    ]
    IGNORABLE_404_URLS = []
    
    # A secret key for this particular Django installation. Used in secret-key
    # hashing algorithms. Set this in your settings, or Django will complain
    # loudly.
    SECRET_KEY = ''
    
    # Default file storage mechanism that holds media.
    DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
    
    # Absolute filesystem path to the directory that will hold user-uploaded files.
    # Example: "/var/www/example.com/media/"
    MEDIA_ROOT = ''
    
    # URL that handles the media served from MEDIA_ROOT.
    # Examples: "http://example.com/media/", "http://media.example.com/"
    MEDIA_URL = ''
    
    # Absolute path to the directory static files should be collected to.
    # Example: "/var/www/example.com/static/"
    STATIC_ROOT = None
    
    # URL that handles the static files served from STATIC_ROOT.
    # Example: "http://example.com/static/", "http://static.example.com/"
    STATIC_URL = None
    
    # List of upload handler classes to be applied in order.
    FILE_UPLOAD_HANDLERS = [
        'django.core.files.uploadhandler.MemoryFileUploadHandler',
        'django.core.files.uploadhandler.TemporaryFileUploadHandler',
    ]
    
    # Maximum size, in bytes, of a request before it will be streamed to the
    # file system instead of into memory.
    FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440  # i.e. 2.5 MB
    
    # Maximum size in bytes of request data (excluding file uploads) that will be
    # read before a SuspiciousOperation (RequestDataTooBig) is raised.
    DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440  # i.e. 2.5 MB
    
    # Maximum number of GET/POST parameters that will be read before a
    # SuspiciousOperation (TooManyFieldsSent) is raised.
    DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000
    
    # Directory in which upload streamed files will be temporarily saved. A value of
    # `None` will make Django use the operating system's default temporary directory
    # (i.e. "/tmp" on *nix systems).
    FILE_UPLOAD_TEMP_DIR = None
    
    # The numeric mode to set newly-uploaded files to. The value should be a mode
    # you'd pass directly to os.chmod; see https://docs.python.org/3/library/os.html#files-and-directories.
    FILE_UPLOAD_PERMISSIONS = None
    
    # The numeric mode to assign to newly-created directories, when uploading files.
    # The value should be a mode as you'd pass to os.chmod;
    # see https://docs.python.org/3/library/os.html#files-and-directories.
    FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
    
    # Python module path where user will place custom format definition.
    # The directory where this setting is pointing should contain subdirectories
    # named as the locales, containing a formats.py file
    # (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use)
    FORMAT_MODULE_PATH = None
    
    # Default formatting for date objects. See all available format strings here:
    # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
    DATE_FORMAT = 'N j, Y'
    
    # Default formatting for datetime objects. See all available format strings here:
    # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
    DATETIME_FORMAT = 'N j, Y, P'
    
    # Default formatting for time objects. See all available format strings here:
    # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
    TIME_FORMAT = 'P'
    
    # Default formatting for date objects when only the year and month are relevant.
    # See all available format strings here:
    # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
    YEAR_MONTH_FORMAT = 'F Y'
    
    # Default formatting for date objects when only the month and day are relevant.
    # See all available format strings here:
    # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
    MONTH_DAY_FORMAT = 'F j'
    
    # Default short formatting for date objects. See all available format strings here:
    # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
    SHORT_DATE_FORMAT = 'm/d/Y'
    
    # Default short formatting for datetime objects.
    # See all available format strings here:
    # http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
    SHORT_DATETIME_FORMAT = 'm/d/Y P'
    
    # Default formats to be used when parsing dates from input boxes, in order
    # See all available format string here:
    # http://docs.python.org/library/datetime.html#strftime-behavior
    # * Note that these format strings are different from the ones to display dates
    DATE_INPUT_FORMATS = [
        '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y',  # '2006-10-25', '10/25/2006', '10/25/06'
        '%b %d %Y', '%b %d, %Y',             # 'Oct 25 2006', 'Oct 25, 2006'
        '%d %b %Y', '%d %b, %Y',             # '25 Oct 2006', '25 Oct, 2006'
        '%B %d %Y', '%B %d, %Y',             # 'October 25 2006', 'October 25, 2006'
        '%d %B %Y', '%d %B, %Y',             # '25 October 2006', '25 October, 2006'
    ]
    
    # Default formats to be used when parsing times from input boxes, in order
    # See all available format string here:
    # http://docs.python.org/library/datetime.html#strftime-behavior
    # * Note that these format strings are different from the ones to display dates
    TIME_INPUT_FORMATS = [
        '%H:%M:%S',     # '14:30:59'
        '%H:%M:%S.%f',  # '14:30:59.000200'
        '%H:%M',        # '14:30'
    ]
    
    # Default formats to be used when parsing dates and times from input boxes,
    # in order
    # See all available format string here:
    # http://docs.python.org/library/datetime.html#strftime-behavior
    # * Note that these format strings are different from the ones to display dates
    DATETIME_INPUT_FORMATS = [
        '%Y-%m-%d %H:%M:%S',     # '2006-10-25 14:30:59'
        '%Y-%m-%d %H:%M:%S.%f',  # '2006-10-25 14:30:59.000200'
        '%Y-%m-%d %H:%M',        # '2006-10-25 14:30'
        '%Y-%m-%d',              # '2006-10-25'
        '%m/%d/%Y %H:%M:%S',     # '10/25/2006 14:30:59'
        '%m/%d/%Y %H:%M:%S.%f',  # '10/25/2006 14:30:59.000200'
        '%m/%d/%Y %H:%M',        # '10/25/2006 14:30'
        '%m/%d/%Y',              # '10/25/2006'
        '%m/%d/%y %H:%M:%S',     # '10/25/06 14:30:59'
        '%m/%d/%y %H:%M:%S.%f',  # '10/25/06 14:30:59.000200'
        '%m/%d/%y %H:%M',        # '10/25/06 14:30'
        '%m/%d/%y',              # '10/25/06'
    ]
    
    # First day of week, to be used on calendars
    # 0 means Sunday, 1 means Monday...
    FIRST_DAY_OF_WEEK = 0
    
    # Decimal separator symbol
    DECIMAL_SEPARATOR = '.'
    
    # Boolean that sets whether to add thousand separator when formatting numbers
    USE_THOUSAND_SEPARATOR = False
    
    # Number of digits that will be together, when splitting them by
    # THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands...
    NUMBER_GROUPING = 0
    
    # Thousand separator symbol
    THOUSAND_SEPARATOR = ','
    
    # The tablespaces to use for each model when not specified otherwise.
    DEFAULT_TABLESPACE = ''
    DEFAULT_INDEX_TABLESPACE = ''
    
    # Default X-Frame-Options header value
    X_FRAME_OPTIONS = 'SAMEORIGIN'
    
    USE_X_FORWARDED_HOST = False
    USE_X_FORWARDED_PORT = False
    
    # The Python dotted path to the WSGI application that Django's internal server
    # (runserver) will use. If `None`, the return value of
    # 'django.core.wsgi.get_wsgi_application' is used, thus preserving the same
    # behavior as previous versions of Django. Otherwise this should point to an
    # actual WSGI application object.
    WSGI_APPLICATION = None
    
    # If your Django app is behind a proxy that sets a header to specify secure
    # connections, AND that proxy ensures that user-submitted headers with the
    # same name are ignored (so that people can't spoof it), set this value to
    # a tuple of (header_name, header_value). For any requests that come in with
    # that header/value, request.is_secure() will return True.
    # WARNING! Only set this if you fully understand what you're doing. Otherwise,
    # you may be opening yourself up to a security risk.
    SECURE_PROXY_SSL_HEADER = None
    
    ##############
    # MIDDLEWARE #
    ##############
    
    # List of middleware to use. Order is important; in the request phase, these
    # middleware will be applied in the order given, and in the response
    # phase the middleware will be applied in reverse order.
    MIDDLEWARE_CLASSES = [
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
    ]
    
    MIDDLEWARE = None
    
    ############
    # SESSIONS #
    ############
    
    # Cache to store session data if using the cache session backend.
    SESSION_CACHE_ALIAS = 'default'
    # Cookie name. This can be whatever you want.
    SESSION_COOKIE_NAME = 'sessionid'
    # Age of cookie, in seconds (default: 2 weeks).
    SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
    # A string like ".example.com", or None for standard domain cookie.
    SESSION_COOKIE_DOMAIN = None
    # Whether the session cookie should be secure (https:// only).
    SESSION_COOKIE_SECURE = False
    # The path of the session cookie.
    SESSION_COOKIE_PATH = '/'
    # Whether to use the non-RFC standard httpOnly flag (IE, FF3+, others)
    SESSION_COOKIE_HTTPONLY = True
    # Whether to save the session data on every request.
    SESSION_SAVE_EVERY_REQUEST = False
    # Whether a user's session cookie expires when the Web browser is closed.
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False
    # The module to store session data
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'
    # Directory to store session files if using the file session module. If None,
    # the backend will use a sensible default.
    SESSION_FILE_PATH = None
    # class to serialize session data
    SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
    
    #########
    # CACHE #
    #########
    
    # The cache backends to use.
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        }
    }
    CACHE_MIDDLEWARE_KEY_PREFIX = ''
    CACHE_MIDDLEWARE_SECONDS = 600
    CACHE_MIDDLEWARE_ALIAS = 'default'
    
    ##################
    # AUTHENTICATION #
    ##################
    
    AUTH_USER_MODEL = 'auth.User'
    
    AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']
    
    LOGIN_URL = '/accounts/login/'
    
    LOGIN_REDIRECT_URL = '/accounts/profile/'
    
    LOGOUT_REDIRECT_URL = None
    
    # The number of days a password reset link is valid for
    PASSWORD_RESET_TIMEOUT_DAYS = 3
    
    # the first hasher in this list is the preferred algorithm.  any
    # password using different algorithms will be converted automatically
    # upon login
    PASSWORD_HASHERS = [
        'django.contrib.auth.hashers.PBKDF2PasswordHasher',
        'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
        'django.contrib.auth.hashers.Argon2PasswordHasher',
        'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
        'django.contrib.auth.hashers.BCryptPasswordHasher',
    ]
    
    AUTH_PASSWORD_VALIDATORS = []
    
    ###########
    # SIGNING #
    ###########
    
    SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
    
    ########
    # CSRF #
    ########
    
    # Dotted path to callable to be used as view when a request is
    # rejected by the CSRF middleware.
    CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'
    
    # Settings for CSRF cookie.
    CSRF_COOKIE_NAME = 'csrftoken'
    CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52
    CSRF_COOKIE_DOMAIN = None
    CSRF_COOKIE_PATH = '/'
    CSRF_COOKIE_SECURE = False
    CSRF_COOKIE_HTTPONLY = False
    CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'
    CSRF_TRUSTED_ORIGINS = []
    CSRF_USE_SESSIONS = False
    
    ############
    # MESSAGES #
    ############
    
    # Class to use as messages backend
    MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
    
    # Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within
    # django.contrib.messages to avoid imports in this settings file.
    
    ###########
    # LOGGING #
    ###########
    
    # The callable to use to configure logging
    LOGGING_CONFIG = 'logging.config.dictConfig'
    
    # Custom logging configuration.
    LOGGING = {}
    
    # Default exception reporter filter class used in case none has been
    # specifically assigned to the HttpRequest instance.
    DEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter'
    
    ###########
    # TESTING #
    ###########
    
    # The name of the class to use to run the test suite
    TEST_RUNNER = 'django.test.runner.DiscoverRunner'
    
    # Apps that don't need to be serialized at test database creation time
    # (only apps with migrations are to start with)
    TEST_NON_SERIALIZED_APPS = []
    
    ############
    # FIXTURES #
    ############
    
    # The list of directories to search for fixtures
    FIXTURE_DIRS = []
    
    ###############
    # STATICFILES #
    ###############
    
    # A list of locations of additional static files
    STATICFILES_DIRS = []
    
    # The default file storage backend used during the build process
    STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
    
    # List of finder classes that know how to find static files in
    # various locations.
    STATICFILES_FINDERS = [
        'django.contrib.staticfiles.finders.FileSystemFinder',
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
        # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
    ]
    
    ##############
    # MIGRATIONS #
    ##############
    
    # Migration module overrides for apps, by app label.
    MIGRATION_MODULES = {}
    
    #################
    # SYSTEM CHECKS #
    #################
    
    # List of all issues generated by system checks that should be silenced. Light
    # issues like warnings, infos or debugs will not generate a message. Silencing
    # serious issues like errors and criticals does not result in hiding the
    # message, but Django will not stop you from e.g. running server.
    SILENCED_SYSTEM_CHECKS = []
    
    #######################
    # SECURITY MIDDLEWARE #
    #######################
    SECURE_BROWSER_XSS_FILTER = False
    SECURE_CONTENT_TYPE_NOSNIFF = False
    SECURE_HSTS_INCLUDE_SUBDOMAINS = False
    SECURE_HSTS_PRELOAD = False
    SECURE_HSTS_SECONDS = 0
    SECURE_REDIRECT_EXEMPT = []
    SECURE_SSL_HOST = None
    SECURE_SSL_REDIRECT = False
    global_settings.py文件

     _get_token中的CSRF_USE_SESSIONS 为False,并不会执行

  • 相关阅读:
    JAVA中int、String的类型转换
    MyEclipse 快捷键
    HTTP 协议详解(转)
    HTTP协议详解
    MYSQL类型与JAVA类型对应表
    XML中<beans>中属性概述
    poj 2342 && hdu 1520
    51nod 1873 初中的算术
    AtCoder Grand Contest 014 B
    “玲珑杯”线上赛 Round #17 河南专场 B.震惊,99%+的中国人都会算错的问题
  • 原文地址:https://www.cnblogs.com/wanglan/p/10379158.html
Copyright © 2011-2022 走看看