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

Уеб програмиране с Django (лекция 2)

aandr
April 17, 2013

Уеб програмиране с Django (лекция 2)

aandr

April 17, 2013
Tweet

More Decks by aandr

Other Decks in Programming

Transcript

  1. (Data) Model View Template
    Дефинира типовете и
    структурата на
    данните

    View full-size slide

  2. (Data) Model View Template
    Дефинира типовете и
    структурата на
    данните
    Бизнес логика

    View full-size slide

  3. (Data) Model View Template
    Дефинира типовете и
    структурата на
    данните
    Бизнес логика Представяне на
    данните

    View full-size slide

  4. class Haiku(models.Model):
    user = models.ForeignKey(User)
    text = models.TextField()
    created = models.DateTimeField(default =
    datetime.now)

    View full-size slide

  5. @login_required
    def add_haiku(request):
    if request.method == "POST":
    haiku = Haiku(user = request.user,
    text = request.POST.get('text'))
    haiku.save()
    return redirect('user-page', username = request.user.username)

    View full-size slide

  6. Generic Views
    DetailView
    ListView
    queryset = Haiku.objects.all()
    context_object_name = “haiku”

    View full-size slide




  7. {{ title }}


    {{ title }}
    За мен:

    {% for fact in facts %}
    {{ title }}
    {% endfor %}



    View full-size slide

  8. Сложни темплейти

    View full-size slide

  9. article.html

    View full-size slide

  10. base.html
    article.html

    View full-size slide

  11. show_article()

    View full-size slide

  12. show_article()
    {% extends "base.html" %}
    {% block title %}
    New York Times: {{article.title}}
    {% endblock %}
    {% block body %}
    {{article.title}}

    By {{article.author.full_name}}

    {{ article.text }}
    {% endblock %}
    article.html

    View full-size slide

  13. show_article()
    base.html




    {% block title %}
    New York Times
    {% endblock %}




    ...


    {% block body %}
    {% endblock %}


    ...



    {% extends "base.html" %}
    {% block title %}
    New York Times: {{article.title}}
    {% endblock %}
    {% block body %}
    {{article.title}}

    By {{article.author.full_name}}

    {{ article.text }}
    {% endblock %}
    article.html

    View full-size slide

  14. show_article()
    base.html




    {% block title %}
    New York Times
    {% endblock %}




    ...


    {% block body %}
    {% endblock %}


    ...



    {% extends "base.html" %}
    {% block title %}
    New York Times: {{article.title}}
    {% endblock %}
    {% block body %}
    {{article.title}}

    By {{article.author.full_name}}

    {{ article.text }}
    {% endblock %}
    article.html

    View full-size slide

  15. {{ article.date|date }} # May 26, 2011
    {{ article.date|timesince }} # 3 days ago
    {{ article.title|lower }} # bear urinates on mayor
    {{ aritcle.html|safe }} # My article
    <abbr>HTML</abbr>
    Още: http://docs.djangoproject.com/en/dev/ref/templates/builtins/
    Можем да си пишем сами: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

    View full-size slide

  16. Client/Server
    Django
    Server
    Web
    Browser
    HTML

    View full-size slide

  17. Client/Server
    Django
    Server
    Web
    Browser
    HTML
    JavaScript
    JSON

    View full-size slide

  18. Client/Server
    Django
    Server
    Web
    Browser
    HTML
    Desktop
    App
    JSON
    JavaScript
    JSON

    View full-size slide

  19. Client/Server
    Django
    Server
    Web
    Browser
    HTML
    Desktop
    App
    JSON
    JavaScript
    JSON
    Twitter: HTML JSON

    View full-size slide

  20. JSON
    {
    first_name: 'John',
    last_name: 'Smith',
    friends: [
    { name: 'Jane Smith', id: 123},
    { name: 'Ivana Trump', id: 444},
    ],
    }
    import json
    json_text = json.dumps(my_object)
    my_object_2 = json.loads(json_text)

    View full-size slide

  21. class User(models.Model):
    username = models.CharField(max_length=30, unique=True)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    email = models.EmailField(blank=True)
    password = models.CharField(max_length=128)
    is_superuser = models.BooleanField(default=False)
    date_joined = models.DateTimeField(
    default=datetime.datetime.now)

    View full-size slide

  22. Нагодяване на вградени модели

    View full-size slide

  23. Нагодяване на вградени модели
    • Monkey patching?

    View full-size slide

  24. Нагодяване на вградени модели
    • Monkey patching?
    • Пренаписваме си ги?

    View full-size slide

  25. Нагодяване на вградени модели
    • Monkey patching?
    • Пренаписваме си ги?
    • Втори модел!

    View full-size slide

  26. from django.db import models
    from django.contrib.auth.models import User
    class Profile(models.Model):
    user = models.OneToOneField(User)
    birthdate = models.DateField(blank = True, null = True)
    nickname = models.CharField(max_length = 255,
    blank = True, null = True)
    photo = models.ImageField(blank = True, null = True)
    phone_number = models.CharField(max_length = 255,
    blank = True, null = True))
    в settings.py добавяме:
    AUTH_PROFILE_MODULE = 'my_app.Profile'
    начин на употреба:
    user = User.objects.get(username = 'jorko4')
    profile = user.get_profile()
    print(profile.nickname)
    * наследяване от типа class Profile(User) би дало същия резултат

    View full-size slide

  27. Промени по модела след syncdb?

    View full-size slide

  28. Промени по модела след syncdb?
    • Бъркаме в базата данни?

    View full-size slide

  29. Промени по модела след syncdb?
    • Бъркаме в базата данни?
    • Миграции!

    View full-size slide

  30. Миграции със South

    View full-size slide

  31. Миграции със South
    • Миграция: Python клас, който изпълнява
    промени по структурата на база данни

    View full-size slide

  32. Миграции със South
    • Миграция: Python клас, който изпълнява
    промени по структурата на база данни
    • Структурата на базата данни започва от
    нулата и се дефинира чрез поредица от
    миграции

    View full-size slide

  33. Миграции със South
    • Миграция: Python клас, който изпълнява
    промени по структурата на база данни
    • Структурата на базата данни започва от
    нулата и се дефинира чрез поредица от
    миграции
    • Консенсус

    View full-size slide

  34. class Migration(SchemaMigration):
    def forwards(self, orm):
    def backwards(self, orm):

    View full-size slide

  35. class Migration(SchemaMigration):
    def forwards(self, orm):
    db.create_table('haikus_haiku', (
    ('id', ...),
    ('user', ...),
    ('text', ...),
    ('created', ...),
    ))
    def backwards(self, orm):
    db.delete_table('haikus_haiku')
    class Migration(SchemaMigration):
    def forwards(self, orm):
    def backwards(self, orm):

    View full-size slide

  36. $ pip install south
    $ python manage.py syncdb
    за съществуващи приложения:
    $ python manage.py convert_to_south myapp
    за нови приложения:
    $ python manage.py schememigration myapp --initial
    при следващи промени:
    $ python manage.py schememigration myapp --auto
    изпълняване на миграции:
    $ python manage.py migrate
    Първоначална миграция

    View full-size slide

  37. myproject/
    myapp/
    migrations/
    0001_initial.py
    0002_add_profile_picture.py
    0003_....

    View full-size slide

  38. Тестване на уеб приложения

    View full-size slide

  39. Тестване на уеб приложения
    • Не тествайте очевидни неща

    View full-size slide

  40. Тестване на уеб приложения
    • Не тествайте очевидни неща
    • Тестване “от край до край”

    View full-size slide

  41. Тестване на уеб приложения
    • Не тествайте очевидни неща
    • Тестване “от край до край”
    • HTTP тестове

    View full-size slide

  42. Тестване на уеб приложения
    • Не тествайте очевидни неща
    • Тестване “от край до край”
    • HTTP тестове
    • Работим с тестови данни

    View full-size slide

  43. Тестване на уеб приложения
    • Не тествайте очевидни неща
    • Тестване “от край до край”
    • HTTP тестове
    • Работим с тестови данни
    • JS тестове - Selenium и QUnit

    View full-size slide

  44. # haikus/admin.py
    from django.contrib import admin
    from haikus.models import Haiku
    class HaikuAdmin(admin.ModelAdmin):
    date_hierarchy = 'created'
    list_display = ('user', 'text', 'created')
    admin.site.register(Haiku, HaikuAdmin)

    View full-size slide

  45. Не откривайте топлата вода

    View full-size slide

  46. Не откривайте топлата вода
    • django-debug-toolbar - за да не пишем print(“test”)

    View full-size slide

  47. Не откривайте топлата вода
    • django-debug-toolbar - за да не пишем print(“test”)
    • django-registration - регистрация на потребители

    View full-size slide

  48. Не откривайте топлата вода
    • django-debug-toolbar - за да не пишем print(“test”)
    • django-registration - регистрация на потребители
    • django-profile - редакция на профили

    View full-size slide

  49. Не откривайте топлата вода
    • django-debug-toolbar - за да не пишем print(“test”)
    • django-registration - регистрация на потребители
    • django-profile - редакция на профили
    • django.contrib.comments - коментари (а ла блог)

    View full-size slide

  50. Не откривайте топлата вода
    • django-debug-toolbar - за да не пишем print(“test”)
    • django-registration - регистрация на потребители
    • django-profile - редакция на профили
    • django.contrib.comments - коментари (а ла блог)
    • django-extensions - улеснения

    View full-size slide

  51. Не откривайте топлата вода
    • django-debug-toolbar - за да не пишем print(“test”)
    • django-registration - регистрация на потребители
    • django-profile - редакция на профили
    • django.contrib.comments - коментари (а ла блог)
    • django-extensions - улеснения
    • django-jsonfield - речници в SQL

    View full-size slide

  52. Не откривайте топлата вода
    • django-debug-toolbar - за да не пишем print(“test”)
    • django-registration - регистрация на потребители
    • django-profile - редакция на профили
    • django.contrib.comments - коментари (а ла блог)
    • django-extensions - улеснения
    • django-jsonfield - речници в SQL
    • sorl-thumbnail - смаляване на картинки

    View full-size slide

  53. Не откривайте топлата вода
    • django-debug-toolbar - за да не пишем print(“test”)
    • django-registration - регистрация на потребители
    • django-profile - редакция на профили
    • django.contrib.comments - коментари (а ла блог)
    • django-extensions - улеснения
    • django-jsonfield - речници в SQL
    • sorl-thumbnail - смаляване на картинки
    • Още: http://djangopackages.com

    View full-size slide