Django community: RSS
This page, updated regularly, aggregates Community blog posts from the Django community.
-
Proxying objects in Python
A lazy object proxy is an object that wraps a callable but defers the call until the object is actually required, and caches the result of said call. These kinds of objects are useful in resolving various dependency issues, few examples: Objects that need to held circular references at each other, but at different stages. To instantiate object Foo you need an instance of Bar. Instance of Bar needs an instance of Foo in some of it methods (but not at construction). Circular imports sound familiar? Performance sensitive code. You don't know ahead of time what you're going to use but you don't want to pay for allocating all the resources at the start as you usually need just few of them. There are other examples, I've just made up a couple for context. If you've used Django you may be familiar with SimpleLazyObject. For simple use-cases it's fine, and if you're already using Django the choice is obvious. Unfortunately it's missing many magic methods, most glaring omissions: __iter__, __getslice__, __call__ etc. It's not too bad, you can just subclass and add them yourself. But what if you need to have __getattr__? The horrors of the infinite recursive call beckon. … -
Proxying objects in Python
A lazy object proxy is an object that wraps a callable but defers the call until the object is actually required, and caches the result of said call. These kinds of objects are useful in resolving various dependency issues, few examples: Objects that need to held circular references at each other, but at different stages. To instantiate object Foo you need an instance of Bar. Instance of Bar needs an instance of Foo in some of it methods (but not at construction). Circular imports sound familiar? Performance sensitive code. You don't know ahead of time what you're going to use but you don't want to pay for allocating all the resources at the start as you usually need just few of them. There are other examples, I've just made up a couple for context. If you've used Django you may be familiar with SimpleLazyObject. For simple use-cases it's fine, and if you're already using Django the choice is obvious. Unfortunately it's missing many magic methods, most glaring omissions: __iter__, __getslice__, __call__ etc. It's not too bad, you can just subclass and add them yourself. But what if you need to have __getattr__? The horrors of the infinite recursive call beckon. … -
Django Forms
This is another example of Django's reusability. We saw how to create your own form in HTML and render it and get data from it using GET or POST methods. Again, Django does this for you. While it certainly is useful knowing how to do this on a basic level, using Django's Forms API can give you more powerful forms with richer features.Like models.py, create a file called forms.py in the app where the form is required. Let's create a simple contact form. In forms.py:forms.pyfrom django import formsclass SimpleUploadForm (forms.Form): name = forms.CharField (label = "Enter name") email = forms.EmailField (label = "Enter email ID", required = False) dob = forms.DateTimeField (label = "Enter date of birth")As you can see, just like a model, we created a simple form. Now let's render it from a view. views.pyfrom django.shortcuts import renderfrom forms import SimpleContactFormdef simple_contact_form (request): form = SimpleContactForm () return render (request, "simple_contact_form.html", {"form":form})Here, we import the SimpleContactForm class from forms.py and initialize its instance in the view. Then we pass that instance as a context to the webpage we're rendering. The view will become clearer when you see the template.simple_contact_form.html<html> <head><title>Simple Contact Form</title></head> <body> <form action = "" … -
Macbook pro black screen and restart problem
This morning I took my macbook pro (a very nice late 2014 retina 15" one) out of my backpack, opened it and plugged in the external monitor. But it stayed black. The macbook's own screen also stayed black. Ouch? It didn't seem to wake up... Some standard things I checked/tried: The battery couldn't be empty yet. The apple logo on the back of the screen was illuminated, right? Of course I had already attached it to the power cord. Which showed its LED, so power wasn't the problem. Screen brightness. Perhaps I dialed it down to zero by accident? No. Close/open again. Take out external display. Etc. Nope. Ok, time to press the power button. No reaction that I could see/hear. Press it 10 seconds. No. Problem with such a new macbook is that it doesn't have a harddisk. The noises a harddisk makes tend to provide pretty good feedback on what's happening normally :-) I just couldn't get the macbook to reset (or shut down)! If the power button doesn't work... Googling turned up two additional tricks: Resetting the "SMC", the system management controller. One of the things it does is monitor the power button... Press shift-option-control-power and release … -
Integrating front-end tools with your Django project
Front-end tools like Grunt and Gulp are becoming very widespread, and there’s good reason for it. The front-end code is no longer static, CSS pre-processors are the norm, and JavaScript modules such as Require, Browserify or even coffeescript are also becoming more common as well. On top of that, when you’re deploying to production, you want to minify everything but when you’re in development mode, you want sourcemaps for JS and CSS among other things. At Lincoln Loop, we use Gulp as our task runner to do the following things: Compile Sass into CSS, including autoprefixer support Compile JavaScript with Browserify Add sourcemaps for our compiled JavaScript and CSS Minify images with imagemin Reload the browser automatically on JavaScript (and/or template) changes Refresh the CSS without reloading the browser on CSS changes Trigger system notifications when Sass or JavaScript has errors Minify JavaScript and CSS for production deploy and finally: Generate a build folder where all the generated files are stored We won’t go into details about our Gulp setup on this post, there’s plenty of information out there (we wrote about Grunt before). If you’re curious about the code thou, here’s a gist of a gulpfile-in-one that includes most … -
Example Ember.js + Django + Django Rest Framework single-page application
Ember.js is one of JavaScript frameworks for creating interactive single page web applications. Pages may change but the browser doesn't reload the page. This framework has some similarities with Django and can be good pick to start with such frontend applications for Django developers with some JavaScript knowledge. In this article I'll show you an example Django + Django Rest Framework + Ember.js application. Classical posts and categories done in Ember and in Django for comparison. -
HTTP headers
Many times you many need the IP address of the computer that's accessing your webapp. You may want it for a survey, or cataloging that user to offer better services and what not. Today we'll see not only how to get the IP address, but a host of other client side information that can be used to fine tune your app.Let's take the IP address for example. I once needed it to see from where the app was being accessed from the most. I wrote a tracker that would piggyback on the client's signal and work backwards all the way to the source and get me the IP address. But little did I know that Django already does that for me. The IP address and host name (ISP) is encoded in the request parameter. Let's see how to view them.To do this we'll create a simple view. In HTML, we'll create a list that contains header name and value, and then populate it through Django.headers.html<html> <head><title>Django HTTP headers</title></head> <body> <ul> {% for header in headers %} … -
App specific URLs
As you may know, Django boasts reusability of apps. This means you can just copy one app from one project, plug it into another and it would still work the same way. Neat, huh? Well, admittedly, till now we've only focused on getting out projects to run. But now that we know the basics of creating a working Django project, it's time to delve deeper and take advantage of Django's rich features.Let's start with URLs. Till now, we just went on adding URLs to the main urls.py as we developed the project. But when the number of URLs starts going into the triple digits, the urls.py file can become massive and difficult to keep track of. So let's see how to create a urls.py file in each app and direct the main file to this new one.In the main urls.py file, add a pattern that will point to the app:url (r'^myapp/', include('myproject.myapp.urls')),This tells Django that whenever someone access the /myapp/ URL they should be directed to the urls.py file in that app. From here on in, all the views rendered in this app will have URLs like /myapp/foo/bar. This makes them easier to manage. There's also another advantage: you no longer need unique … -
Almost premature optimization
In airmozilla the tests almost all derive from one base class whose tearDown deletes the automatically generated settings.MEDIA_ROOT directory and everything in it. Then there's some code that makes sure a certain thing from the fixtures has a picture uploaded to it. That means it has do that shutil.rmtree(directory) and that shutil.copy(src, dst) on almost every single test. Some might also not need or depend on it but it's conveninent to put it here. Anyway, I thought this is all a bit excessive and I could probably optimize that by defining a custom test runner that is first responsible for creating a clean settings.MEDIA_ROOT with the necessary file in it and secondly, when the test suite ends, it deletes the directory. But before I write that, let's measure how many gazillion milliseconds this is chewing up. Basically, the tearDown was called 361 times and the _upload_media 281 times. In total, this adds to a whopping total of 0.21 seconds! (of the total of 69.133 seconds it takes to run the whole thing). I think I'll cancel that optimization idea. Doing some light shutil operations are dirt cheap. -
Almost premature optimization
In airmozilla the tests almost all derive from one base class whose tearDown deletes the automatically generated settings.MEDIA_ROOT directory and everything in it. Then there's some code that makes sure a certain thing from the fixtures has a picture uploaded to it. That means it has do that shutil.rmtree(directory) and that shutil.copy(src, dst) on almost every single test. Some might also not need or depend on it but it's conveninent to put it here. Anyway, I thought this is all a bit excessive and I could probably optimize that by defining a custom test runner that is first responsible for creating a clean settings.MEDIA_ROOT with the necessary file in it and secondly, when the test suite ends, it deletes the directory. But before I write that, let's measure how many gazillion milliseconds this is chewing up. Basically, the tearDown was called 361 times and the _upload_media 281 times. In total, this adds to a whopping total of 0.21 seconds! (of the total of 69.133 seconds it takes to run the whole thing). I think I'll cancel that optimization idea. Doing some light shutil operations are dirt cheap. -
Terrible choices: MySQL
I've used MySQL for a while now, and there were lots of surprising things I needed to cater for. This is from a Django and MySQL 5.5 perspective [*]. Later on you'll see the horrible things I did to work around. It was a terrible experience, as I've also used PostgreSQL ... Feel free to add your own experiences in the comments section. The defaults* MySQL supports a large part of the ANSI SQL 99 standard, however the default settings are nowhere close to that. If you used any other database then it's going to be a very perplexing experience. SQL mode* With the default settings MySQL truncates and does other unspeakable things to data for the sake of not giving errors. Where is this a correct choice, hard to say. What the defaults allow: Storing invalid dates like '0000-00-00' or '2010-01-00' [1]. Silently treating errors like: Specifying an unavailable storage engine. It will use the default engine, silently [2]. Inserting invalid data. Larger strings get truncated to the maximum length. Larger integers get truncated to the maximum. Other things get converted to NULL if the column allows that. All silently [3]. And no, ORMs won't save you from this … -
Terrible choices: MySQL
I've used MySQL for a while now, and there were lots of surprising things I needed to cater for. This is from a Django and MySQL 5.5 perspective [*]. Later on you'll see the horrible things I did to work around. It was a terrible experience, as I've also used PostgreSQL ... Feel free to add your own experiences in the comments section. The defaults * MySQL supports a large part of the ANSI SQL 99 standard, however the default settings are nowhere close to that. If you used any other database then it's going to be a very perplexing experience. SQL mode * With the default settings MySQL truncates and does other unspeakable things to data for the sake of not giving errors. Where is this a correct choice, hard to say. What the defaults allow: Storing invalid dates like '0000-00-00' or '2010-01-00' [1]. Silently treating errors like: Specifying an unavailable storage engine. It will use the default engine, silently [2]. Inserting invalid data. Larger strings get truncated to the maximum length. Larger integers get truncated to the maximum. Other things get converted to NULL if the column allows that. All silently [3]. And no, ORMs won't save you … -
Terrible choices: MySQL
I've used MySQL for a while now, and there were lots of surprising things I needed to cater for. This is from a Django and MySQL 5.5 perspective [*]. Later on you'll see the horrible things I did to work around. It was a terrible experience, as I've also used PostgreSQL ... Feel free to add your own experiences in the comments section. The defaults * MySQL supports a large part of the ANSI SQL 99 standard, however the default settings are nowhere close to that. If you used any other database then it's going to be a very perplexing experience. SQL mode * With the default settings MySQL truncates and does other unspeakable things to data for the sake of not giving errors. Where is this a correct choice, hard to say. What the defaults allow: Storing invalid dates like '0000-00-00' or '2010-01-00' [1]. Silently treating errors like: Specifying an unavailable storage engine. It will use the default engine, silently [2]. Inserting invalid data. Larger strings get truncated to the maximum length. Larger integers get truncated to the maximum. Other things get converted to NULL if the column allows that. All silently [3]. And no, ORMs won't save you … -
Custom Django Admin Actions
Doing bulk data actions in the admin is easy, if you know how to do it. In this video you will learn how to create your own custom admin actions so you can update a lot of data objects all at the same time.Watch Now... -
BangPypers Dev Sprint!
Here is the definition of sprint from Wikipedia:On 3rd Saturday of every month there will be a meetup for Python developers in Bangalore(BangPypers) to have talks and workshops. This month instead of talks/workshops, a dev sprint was held. The basic idea was to encourage Python developers to contribute to any open source projects or work on their open source projects.I was working on Nidaba, a project to extract information from StackOverflow dumps. I went to the meetup and gave a brief description about it. Several people were interested to work. I helped them a bit on getting started and the issues to solve. By the end of event, I got one pull request which fixed a typo in setup file. Few people helped in adding couple of utility functions for the project. A couple of them were interested to continue working on with it in the coming weekends. In the end PSSI sponsored T-shirt :) Here are a few snapshots of event. -
A quick introduction to Docker containers for Django web developers
Docker is a platform for running applications in isolation. Using Linux containers makes the software layer isolated from the base system. The overhead needed for hardware virtualization used by for example Virtualbox is removed. Docker can help in development and deployment of web based applications and services - let us see how and when. -
I did an Aú Batido in 2014, now what?
This is my summary of my resolutions for 2014 and an early pass at my resolutions for 2015. I'm doing this right now instead of at the end of the year because as of the afternoon of December 21, I'm going off the grid. Resolutions Accomplished in 2014 Release the second edition of Two Scoops of Django. Visited South America. Visited two new nations, Argentina and Brazil. Went back to the East Coast to visit Philadelphia and places in New Jersey. Went back to the Philippines. Took some awesome road trips around the USA. My favorite was driving up the Pacific Coast Highway. Took a fun class with Audrey. We did woodshop! Learned how to do Aú Batido! General Accomplishments Published Two Scoops of Django 1.6 with my awesome wife, Audrey Roy Greenfeld. Experienced my first major surgery. Started working at Eventbrite. Found a Inland Empire Capoeira group but still remained friends with Capoeira Batuque. Gave talks at: Wharton School of Business Web Conference PyDay Mendoza Python Brazil PyCon Argentina Experienced the unbelievably tasty asado (steak) of Argentina. Participated in organizing the first Django Bar Camp. Played in 2 Capoeira Rodas in Brazil. Participated in the successful effort to reboot … -
I did an Aú Batido in 2014, now what?
This is my summary of my resolutions for 2014 and an early pass at my resolutions for 2015. I'm doing this right now instead of at the end of the year because as of the afternoon of December 21, I'm going off the grid. Resolutions Accomplished in 2014 Release the second edition of Two Scoops of Django. Visited South America. Visited two new nations, Argentina and Brazil. Went back to the East Coast to visit Philadelphia and places in New Jersey. Went back to the Philippines. Took some awesome road trips around the USA. My favorite was driving up the Pacific Coast Highway. Took a fun class with Audrey. We did woodshop! Learned how to do Aú Batido! General Accomplishments Published Two Scoops of Django 1.6 with my awesome wife, Audrey Roy Greenfeld. Experienced my first major surgery. Started working at Eventbrite. Found a Inland Empire Capoeira group but still remained friends with Capoeira Batuque. Gave talks at: Wharton School of Business Web Conference PyDay Mendoza Python Brazil PyCon Argentina Experienced the unbelievably tasty asado (steak) of Argentina. Participated in organizing the first Django Bar Camp. Played in 2 Capoeira Rodas in Brazil. Participated in the effort to reboot LA … -
Server migration for BotBot.me
End of last week vitaly and I launched a redesign of BotBot.me user account. You can now suport us by subscribing to it for 3$/month and even log personal channel for 2$/month. If you are curious check it out here I would like to share with you the scenario & tactics we used to do this with least service interruption. BotBot.me receives less traffic than most our customers site but it collects hundreds of messages per minutes which lead to interesting challenges. As part of this deployment we were also changing cloud provider. So we needed to move all the underlying infrastructure. Here it is the main services constituing BotBot.me: redis postgresql go IRC client python plugins django web interface We use slatstack to configure our servers. I am not going to present the detailed configuration of each pieces but instead explain the strategy we followed. Reverse Proxy From now on legacy_server is the legacy server and new_server the new server. On this project we use nginx to do the TLS termination, serving static assets and finally reverse proxying the django app. We use autossh to create ssh tunnel from new_server to legacy_server. Here it is an example for redis: … -
Quick Introduction to Mock
Quick Introduction to Mock -
Generate Sphinx Friendly Docstrings For Python Functions In Emacs!
Today, I went to Django REST Framework Workshop. After the workshop is completed, and we were discussing about Emacs, Krace showed this cool plugin sphinx-doc, it inserts docstring skeleton for Python functions/methods as per the requirement of the Sphinx documentation generator.Installation:To install it from MELPA, run "M-x package-list-packages", search for "sphinx-doc" , mark it with i and press x to install.Configuration:Add these lines to Your emacs config to enable sphinx-doc-mode.(add-hook 'python-mode-hook (lambda () (require 'sphinx-doc) (sphinx-doc-mode t)))If you document your code(infact you should), this plugin saves quite a few strokes! -
Quickly Check If Your Django App Is Ready For Production!
Before deploying Your Django app, You need to make sure security, logging and other issues are taken care. Django provides a simple deployment checklist which helps a lot. In development version Django provides --deploy option, which does some security checks. You can run it withpython manage.py check --deploy --settings=production_settingsI have just created a new project and Django identified 6 security issues in it.→ python manage.py check --deploy System check identified some issues:WARNINGS:?: (security.W001) You do not have 'django.middleware.security.SecurityMiddleware' in your MIDDLEWARE_CLASSES so the SECURE_HSTS_SECONDS, SECURE_CONTENT_TYPE_NOSNIFF, SECURE_BROWSER_XSS_FILTER, and SECURE_SSL_REDIRECT settings will have no effect.?: (security.W012) SESSION_COOKIE_SECURE is not set to True. Using a secure-only session cookie makes it more difficult for network traffic sniffers to hijack user sessions.?: (security.W016) You have 'django.middleware.csrf.CsrfViewMiddleware' in your MIDDLEWARE_CLASSES, but you have not set CSRF_COOKIE_SECURE to True. Using a secure-only CSRF cookie makes it more difficult for network traffic sniffers to steal the CSRF token.?: (security.W017) You have 'django.middleware.csrf.CsrfViewMiddleware' in your MIDDLEWARE_CLASSES, but you have not set CSRF_COOKIE_HTTPONLY to True. Using an HttpOnly CSRF cookie makes it more difficult for cross-site scripting attacks to steal the CSRF token.?: (security.W018) You should not have DEBUG set … -
Naming things: don't use reserved words
I'm currently cleaning up some code. Some people just cannot spell "p-e-p-8" if their lives depended on it, apparently. Luckily I'm civilized so I only threaten with dismemberment. Look at this gem I just uncovered: tg_after = instance.filter.technischegegevensfilter_set.exclude( pk=instance.pk).filter( datum_vanaf__gt=instance.datum_vanaf).order_by( 'datum_vanaf')[:1] Don't mind about the Dutch in there. Just look at those two filter words in the first two lines. They're even nicely underneath each other. At least they are now, I first had to fit the 159 characters long line within 78 characters, of course. In Django, you do sql filtering with .filter(some_condition=42). That's not what's happening in the first line, though. There's a foreign key called filter there! So the first filter is the name of a foreign key and the second filter is the filter method that is used everywhere in Django. Big confusion. And big chance that someone else that reads the code messes it up somehow. So... steer clear of common words used in your programming language or framework or whatever. Some examples: Don't use type as an name. Use customer_type or station_type or whatever. Only use type by itself if you really mean the python build-in. Don't use class. Either use the standard klass … -
Introducing django-nocaptcha-recaptcha
Introducing django-nocaptcha-recaptcha -
Build a scalable Twitter clone with Django and GetStream.io
Have a look at this tutorial on how to build a scalable twitter clone using django and getstream.io Share and Enjoy: