Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to Django v2

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for Kien Nguyen Kien Nguyen
November 20, 2013

Introduction to Django v2

Introduction to django and deploy to self-hosted server

Avatar for Kien Nguyen

Kien Nguyen

November 20, 2013
Tweet

More Decks by Kien Nguyen

Other Decks in Programming

Transcript

  1. Model - View - Template Model - what things are

    View - how things are processed Template - How things are presented
  2. Models import datetime from django.db import models from django.utils import

    timezone class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
  3. Represents the DB objects BEGIN; CREATE TABLE "codecamp_question" ( "id"

    integer NOT NULL PRIMARY KEY, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL ) ; CREATE TABLE "codecamp_choice" ( "id" integer NOT NULL PRIMARY KEY, "question_id" integer NOT NULL REFERENCES "codecamp_question" ("id"), "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL ) ; COMMIT;
  4. Views Where all magic happens Normally Keep your logic in

    the model Process model instances Render HTML
  5. Views def vote(request, question_id): p = get_object_or_404(Question, pk=question_id) try: selected_choice

    = p.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): # Redisplay the question voting form. return render(request, 'polls/detail.html', { 'question': p, 'error_message': "You didn't select a choice.", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('results', args=(p.id,)))
  6. index.html {% if latest_question_list %} <ul> {% for question in

    latest_question_list %} <li> <a href="{% url 'detail' question.id %}"> {{ question.question_text }} </a> </li> {% endfor %} </ul> {% else %} <p>No polls are available.</p> {% endif %}
  7. views.py from django.shortcuts import render, get_object_or_404 from django.http import HttpResponseRedirect,

    HttpResponse from django.core.urlresolvers import reverse from codecamp.models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] context = {'latest_question_list': latest_question_list} return render(request, 'polls/index.html', context)
  8. detail.html <h1>{{ question.question_text }}</h1> {% if error_message %} <p><strong>{{ error_message

    }}</strong></p> {% endif %} <form action="{% url 'vote' question.id %}" method="post"> {% csrf_token %} {% for choice in question.choice_set.all %} <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" /> <label for="choice{{ forloop.counter }}"> {{ choice.choice_text }} </label><br /> {% endfor %} <input type="submit" value="Vote" /> </form>
  9. views.py from django.shortcuts import render, get_object_or_404 from django.http import HttpResponseRedirect,

    HttpResponse from django.core.urlresolvers import reverse from codecamp.models import Question def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', { 'question': question })
  10. Security advantages No raw SQL from users - we deal

    with models and queries Automatic HTML parsing - no XSS attacks CSRF protection - no replay of forms by other code
  11. URLs from django.conf.urls import patterns, include, url from codecamp import

    views # for admin page from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^polls/(?P<question_id>\d+)/$', views.detail, name='detail'), url(r'^polls/(?P<question_id>\d+)/results/$', views.results, name='results'), url(r'^polls/(?P<question_id>\d+)/vote/$', views.vote, name='vote'), url(r'^admin/', include(admin.site.urls)), ) URLs map to views (view Regular expressions)
  12. Views are python function from django.shortcuts import render, get_object_or_404 from

    django.http import HttpResponseRedirect, HttpResponse from django.core.urlresolvers import reverse from codecamp.models import Question def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', { 'question': question })
  13. Admin interface class ChoiceInline(admin.StackedInline): model = models.Choice extra = 4

    class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date']}), ] search_fields = ['question_text'] list_display = ('question_text', 'pub_date', 'was_published_recently') inlines = [ChoiceInline] admin.site.register(models.Question, QuestionAdmin)
  14. Admin interface class MemberAdmin(UserAdmin): list_filter = ('is_admin', ) filter_horizontal =

    () fieldsets = ( (None, {'fields': ('username', 'password')}), (_('Personal info'), {'fields': ('email', )}), ) search_fields = ('email', 'username') list_display = ('username', 'email', 'is_admin', 'date_joined') list_per_page = 50 admin.site.register(models.Member, MemberAdmin) admin.site.register(models.Question, QuestionAdmin)
  15. manage.py shell: start up a python shell with your django

    project loaded in test: run you unit test runserver: run built in server for python app syncdb: create SQL for your models
  16. tools fabric to distribute code to server uWSGI - similar

    gunicorn but write in C, and support a lot of features
  17. deployment with rollback each release folder is snapshot of a

    git commit each release contain it own virtual environment isolate releases about python package, not system package !?
  18. zero downtime uWSIG support autoload by watching changing of a

    file or folder when deploy new release write to new file
  19. def release_commit(commit): code_dir = '/srv/simpleprints/base' new_release_dir = '/srv/simpleprints/releases/%s' % commit

    # create new release dir run('rm -rf %s' % new_release_dir) run('mkdir -p %s' % new_release_dir) with cd(code_dir): run('git archive %s | tar -C %s -xf -' % (commit, new_release_dir)) remove_old_release() # create virtualenv with cd(new_release_dir): run('virtualenv venv') # install with virtualenv('%s/venv/' % new_release_dir): run('pip install -r %s/requirements.txt' % new_release_dir) run('chown -R kiennt %s' % new_release_dir) reload_uwsgi_for_commit(commit)
  20. QA