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. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. @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 Slide

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

    View Slide




  8. {{ title }}


    {{ title }}
    За мен:

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



    View Slide

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

    View Slide

  10. View Slide

  11. View Slide

  12. article.html

    View Slide

  13. base.html
    article.html

    View Slide

  14. show_article()

    View Slide

  15. 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 Slide

  16. 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 Slide

  17. 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 Slide

  18. {{ 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 Slide

  19. View Slide

  20. View Slide

  21. Client/Server
    Django
    Server
    Web
    Browser
    HTML

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. 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 Slide

  26. 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  39. View Slide

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

    View Slide

  41. 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 Slide

  42. $ 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  50. # 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide