Giter Site home page Giter Site logo

askaoahmedsaad / django-validated-file Goto Github PK

View Code? Open in Web Editor NEW

This project forked from kaleidos/django-validated-file

0.0 2.0 0.0 251 KB

This Django app adds a new field type, ValidatedFileField, which adds the capability of checking the document size and types the user may send.

License: BSD 3-Clause "New" or "Revised" License

Shell 0.58% Python 99.42%

django-validated-file's Introduction

django-validated-file

image

image

image

image

This Django app adds a new field type, ValidatedFileField, that add the capability of checking the document size and types the user may send.

Installation

  • Download and install package with python setup.py install.
  • Note that this package depends on python-magic (to check field types).
  • Add 'validatedfile' to your INSTALLED_APPS in settings.py.

Validate single file

Create a model and add a field of type ValidatedFileField. You can add a maximum size in bytes and a list of valid mime types that will be allowed. The list of all mime types is available here: http://www.iana.org/assignments/media-types/index.html:

from django.db import models
from validatedfile.fields import ValidatedFileField

class TestModel(models.Model):
    the_file = ValidatedFileField(
                    null = True,
                    blank = True,
                    upload_to = 'testfile',
                    max_upload_size = 10240,
                    content_types = ['image/png'])

The model can be used in forms or model forms like a normal FileField. If a user tries to upload a file with too much size or without a valid type, a form validation error will occur.

Validate quota usage

This example also checks the total size of all files uploaded by one user:

(in models.py)

from django.contrib.auth.models import User
from django.db import models
from validatedfile.fields import ValidatedFileField

class TestModel(models.Model):
    user = models.ForeignKey(
                    User,
                    null = False,
                    blank = False,
                    related_name = 'test_models')
    the_file = ValidatedFileField(
                    null = True,
                    blank = True,
                    upload_to = 'testfile',
                    max_upload_size = 10240,
                    content_types = ['image/png'])

(in forms.py)

from django import forms
from validatedfile.fields import QuotaValidator
from models.py import TestModel

class TestModelForm(models.ModelForm):
    the_file = forms.FileField(
                    required = True,
                    validators = [QuotaValidator(max_usage = 102400)])

    class Meta:
        model = TestModel
        fields = ['the_file']

    def __init__(self, user, *args, **kwargs):
        super(TestModelForm, self).__init__(*args, **kwargs)
        self.user = user
        self.fields['the_file'].validators[0].update_quota(
                items = self.user.test_models.all(),
                attr_name = 'the_file',
            )

    def exceeds_quota(self):
        return self.fields['the_file'].validators[0].quota.exceeds()

    def save(self, *args, **kwargs):
        model = super(TestModelForm, self).save(commit = False)
        model.user = self.user
        model.save()

Note on DOS attacks

Important note: the check of the file size is made by Django once the whole file has been uploaded to the server and stored in a temp directory (or in memory if the file is small). Thus, this is useful to guarantee the quota of the users, for example, but will not stop an attacking user that wants to block the server by sending huge files (e. g. of several Gb).

To avoid this, you need to configure your front end to limit the size of uploaded files. How to do it depends on the software you are using. For example, if you use apache, you should use LimitRequestBody directive (http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody).

This is a complementary measure, because you'll usually want normal users that exceed the size by a reasonable amount to get a friendly form validation message, while attacking users will see how their connection is abruptly cut before the file finishes uploading. So the recommended setting is to give max_upload_size a small value (e.g. 5Mb) and LimitRequestBody a higher one (e.g. 100Mb).

django-validated-file's People

Contributors

burhan avatar hirunatan avatar jarus avatar jespino avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.