Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Програмиране с Питон - Django, част 1

2,127 views

Published on

  • Be the first to comment

  • Be the first to like this

Програмиране с Питон - Django, част 1

  1. 1. Уеб програмиране сDjango“Програмиране с Python”, ФМИ17.05.2012 г.
  2. 2. Цел за днес
  3. 3. Цел за днес
  4. 4. + хайку = (5, 7, 5)Цел за днес
  5. 5. + хайку = (5, 7, 5)Цел за днес
  6. 6. Полъх на риган.Бистър пролетен повей.Бира в “Торонто”.
  7. 7. “Как работи интернеДа” обзор
  8. 8. fmi.py-Browser bg.net
  9. 9. fmi.py-Browser Дай ми “/tasks/5” bg.net
  10. 10. fmi.py-Browser Дай ми “/tasks/5” bg.net Ето ти HTML за “/tasks/5” <html> <head> <title>Програмиране с Python</title> ...
  11. 11. fmi.py-Browser Дай ми “/tasks/5” bg.net Ето ти HTML за “/tasks/5” <html> <head> <title>Програмиране с Python</title> ... Липсва ми “/images/logo.png”
  12. 12. fmi.py-Browser Дай ми “/tasks/5” bg.net Ето ти HTML за “/tasks/5” <html> <head> <title>Програмиране с Python</title> ... Липсва ми “/images/logo.png” Ето ти “/images/logo.png”
  13. 13. fmi.py-Browser Дай ми “/tasks/5” bg.net HTTP методи
  14. 14. fmi.py-Browser Дай ми /tasks/5 GET “/tasks/5” bg.net HTTP методи
  15. 15. fmi.py-Browser Дай ми /tasks/5 GET “/tasks/5” bg.net def GET(url): return html за “дърпане” на данни def POST(url, **kwargs): return html за “пращане” на данни HTTP методи
  16. 16. GET(“/HjncO.png”)
  17. 17. GET(“/login.php”)
  18. 18. POST(“/login.php”,login = “gotin92@abv.bg”,password = “supertaina”)
  19. 19. <!DOCTYPE html><html><head> <title>Моята първа уеб страница</title> <script src="myjavascript.js"></script></head><body> <h1>Добре дошли!</h1> <img src="pony.jpg" alt="моята снимка"> <p>За мен:</p> <ul> <li>Аз съм пони</li> <li>Обичам да паса трева</li> <li>Любимият ми филм e "Отнесени от вихъра"</li> </ul></body></html>
  20. 20. <!DOCTYPE html><html><head> <title>Моята първа уеб страница</title> <script src="myjavascript.js"></script></head><body> <h1>Добре дошли!</h1> <img src="pony.jpg" alt="моята снимка"> <p>За мен:</p> <ul> <li>Аз съм пони</li> <li>Обичам да паса трева</li> <li>Любимият ми филм e "Отнесени от вихъра"</li> </ul></body></html>
  21. 21. самостоятелен таг<img src="pony.jpg" alt="моята снимка"> атрибут атрибут <p>За мен:</p> отварящ таг затварящ таг
  22. 22. JavaScript CSS• Интерактивност вътре • Контролира външния вид страниците на HTML елементите• Изпълнява се в браузера • Разделение на съдържание и стил• Може да комуникира със сървера• Gmail
  23. 23. HTML 5!
  24. 24. Django: framework за уеб приложения Прави скучните неща вместо нас. Кара ни да пишем структуриран код. Позволява rapid prototyping.
  25. 25. Django Convention vs. configuration Ако следваш правилата,почти всичко работи без конфигурация.
  26. 26. http://docs.djangoproject.com
  27. 27. Python 2.x!
  28. 28. $ pip install django препоръчваме иdjango-annoying, django-extensions и werkzeug
  29. 29. $ django-admin.py startproject myproject илиhttp://github.com/aandr/django-starter
  30. 30. myproject/ __init__.py общи настройки settings.py local_settings.py настройки за този компютър urls.py manage.py скрипт за системни команди media static картинки, JS, CSS templates HTML templates
  31. 31. $ python manage.py startapp calculator * не бъркайте startapp и startproject
  32. 32. myproject/ calculator/ __init__.py models.py tests.py views.py settings.py local_settings.py urls.py manage.py media static templates
  33. 33. Models,Views,Templates (MVT)
  34. 34. Models,Views,Templates (MVT) Ако сте ползвали MVC: Models = Models Views = Controllers Templates = Views a
  35. 35. (Data) Model View TemplateДефинира типовете иструктурата наданнитеPersistence (четене иписане в бази данни)Примери:- потребител- продукт в магазин- съобщение
  36. 36. (Data) Model View TemplateДефинира типовете и Бизнес логикаструктурата на Вход/изход междуданните модела иPersistence (четене и потребителяписане в бази данни) Примери:Примери: - изпращане на- потребител съобщение- продукт в магазин - добавяне на продукт- съобщение към кошница - търсене сред потребители
  37. 37. (Data) Model View TemplateДефинира типовете и Бизнес логика Представяне наструктурата на данните Вход/изход междуданните модела и Без логикаPersistence (четене и потребителя HTMLписане в бази данни) Примери: Примери:Примери: - изпращане на - изпращане на- потребител съобщение съобщение- продукт в магазин - добавяне на продукт - добавяне на продукт- съобщение към кошница към кошница - търсене сред - търсене сред потребители потребители
  38. 38. Моделът помни.Темплейтът го показва.А view-то мисли.
  39. 39. django.http.HttpRequestdef myview(request): ... return http_response
  40. 40. from django.template.response import TemplateResponsedef calculator(request): if request.method == POST: a = int(request.POST[a]) b = int(request.POST[b]) result = a + b return TemplateResponse(request, calculator.html, locals())
  41. 41. Повече от едно view? books.views.searchHTTP заявка urls.py myapp.views.myview store.views.checkout
  42. 42. # urls.pyfrom django.conf.urls.defaults import patterns, include, urlurlpatterns = patterns(, url(r^calculator$, ‘calculator.views.calculator), ... )# /calculator.py => calculator.views.calculator* не слагайте “/” в началото на регулярния израз
  43. 43. $ python manage.py runserver
  44. 44. МоделиПотребител• Username• Име• Фамилия• Email• Парола• Администатор?• Дата
  45. 45. МоделиПотребител Хайку• Username • Потребител• Име • Текст• Фамилия • Дата• Email• Парола• Администатор?• Дата
  46. 46. 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)
  47. 47. 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) * ползвайте на готово: from django.contrib.auth.models import User
  48. 48. unique=True # не може да се повтаряblank=True # не е задължителноdefault=“Иван” # стойност по подразбиране
  49. 49. models.CharField(max_length = 256)models.TextField()models.IntegerField()models.BooleanField()models.DateTimeField()models.FileField()и още 20-тина:http://docs.djangoproject.com/en/dev/ref/models/fields/
  50. 50. Създаване на запис:spiro = User(username=spiro95, first_name=Spiridon)spiro.lastname = Karaivanovspiro.save()Търсене на много записи:users = User.objects.filter(first_name=Spiridon)print(users) # 10print(users[5].lastname) # StefanovТърсене на един запис и промяна:spiro2 = User.objects.get(username=spiro95)print(spiro2.lastname) # Karaivanovspiro2.lastname = Grozdevspiro2.save()
  51. 51. Object-Relational Mapper (ORM)Python класове SQL таблициКласови полета SQL колониPython обекти SQL записи
  52. 52. Object-Relational Mapper (ORM)Python класове SQL таблициКласови полета SQL колониPython обекти SQL записи Един код за различни бази данни. SQLite по подразбиране.
  53. 53. уловки?
  54. 54. Релационен модел• Полетата могат да са само скаларни типове• За сложни типове, трябва да създадем нов клас + таблица• Всеки обект има уникален номер (myobject.id)• За да реферират друг обект, трябва да ползвате id-то му• Връзка към друг обект = foreign key• Връзките са двустранни (haiku.user и user.haiku_set)
  55. 55. # haikus/models.pyfrom django.db import modelsfrom django.contrib.auth.models import Userclass Haiku(models.Model): user = models.ForeignKey(User) text = models.TextField() created = models.DateTimeField(default = datetime.now)# примерuser = User.objects.get(id = 20)haiku = Haiku(user = user, text = ...)haiku.save()print(haiku.user_id) # 20print(haiku.user.firstname) # Spiridonprint(user.haiku_set.all()) # [<Haiku: ...>]
  56. 56. # haikus/models.pyfrom django.db import modelsfrom django.contrib.auth.models import Userclass Haiku(models.Model): user = models.ForeignKey(User) text = models.TextField() created = models.DateTimeField(default = datetime.now)# пример Django взима user_id, дърпа от таблицата users записа с това iduser = User.objects.get(id = 20) и го връща незабележимо.haiku = Haiku(user = user, text = ...)haiku.save()print(haiku.user_id) # 20print(haiku.user.firstname) # Spiridonprint(user.haiku_set.all()) # [<Haiku: ...>]
  57. 57. $ python manage.py syncdb* syncdb не променя вече съществуващи таблици, за това не бързайте да го викатедокато не избистрите моделите си; python manage.py sqldiff помага
  58. 58. $ python manage.py shell_plus* shell_plus изисква django_extensions; ако нямате, ползвайте shell
  59. 59. Структура на edno57 Страница наНачална Ново хайку потребител
  60. 60. Структура на edno57 Страница на Начална Ново хайку потребителПоказва Показва хайкута Проверявапоследните 50 на потребителя и хайкуто и гохайкута форма за ново записва хайку
  61. 61. Структура на edno57 Страница на Начална Ново хайку потребителПоказва Показва хайкута Проверявапоследните 50 на потребителя и хайкуто и гохайкута форма за ново записва хайку/ /username /add (напр. /kiril)
  62. 62. Структура на edno57 Страница на Начална Ново хайку потребителПоказва Показва хайкута Проверявапоследните 50 на потребителя и хайкуто и гохайкута форма за ново записва хайку/ /username /add (напр. /kiril) Login Logout/login /logout
  63. 63. from django.template.response import TemplateResponsefrom django.contrib.auth.decorators import login_requiredfrom django.contrib.auth.models import Userfrom django.shortcuts import *from haikus.models import Haikudef homepage(request): latest_haikus = Haiku.objects.all().order(-created)[0:50] return TemplateResponse(request, "homepage.html", locals())
  64. 64. from django.template.response import TemplateResponsefrom django.contrib.auth.decorators import login_requiredfrom django.contrib.auth.models import Userfrom django.shortcuts import *from haikus.models import Haikudef homepage(request): latest_haikus = Haiku.objects.all().order(-created)[0:50] return TemplateResponse(request, "homepage.html", locals())def user_page(request, username): user = get_object_or_404(User, username = username) haikus = user.haiku_set.all() is_me = request.user == user return TemplateResponse(request, "userpage.html", locals())
  65. 65. @login_requireddef 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)
  66. 66. Проверява дали потребителят е логнат в системата@login_requireddef 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)
  67. 67. Templates• Приемат речник от view-то (наречен context)• Форматират го в текст (най-често HTML)• Изрази: {{ title }} {{ user.first_name }}• Елементарна логика: {% if a > 5 %}а е голямо!{% endif %} {% for el in mylist %}{{ el.name }}{% endfor %}
  68. 68. <!DOCTYPE html> <html> <head>def myview(request): <title>{{ title }}</title> facts = [fact 1, </head> fact 2, <body> fact 3] <h1>{{ title }}</h1> title = "Facts about me" <p>За мен:</p> return TemplateResponse(request, <ul> "template.html", {% for fact in facts %} {facts: facts, <li>{{ title }}</li> title: title }) {% endfor %} </ul> </body> </html>
  69. 69. Топлата водаdjango.contrib. auth # потребители, права, login, logout admin # административен панел comments # коментари (стил “блог”) с модерация flatpages # статични страници (about, FAQ, help) gis # GeoDjango - картография, географски примитиви messages # нотификации към потребителя (напр. “Операцията е успешна.”) syndication # генериране на RSS feeds ...Още: http://www.djangopackages.com/
  70. 70. http://github.com/aandr/edno57
  71. 71. Ресурси• http://docs.djangoproject.com/• http://docs.djangoproject.com/en/dev/intro/ tutorial01/• HTML & CSS: • http://philip.greenspun.com/seia/html • http://diveintohtml5.org/ • http://www.tizag.com/cssT/

×