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

Introduction to Django v2

Introduction to Django v2

Introduction to django and deploy to self-hosted server

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