Bir Django Projesi : <Buraya RUBY ekleyin>

Bir Django Projesi : <Buraya RUBY ekleyin>

Devnot Summit 2019, Ruby ve Ruby on Rails'den etkilenerek ürettiğim Django Project Template sunumu.

033485f7e18823d4ccabb24e5cb4935f?s=128

Uğur Özyılmazel

April 13, 2019
Tweet

Transcript

  1. 4.

    $ tree . ├── devsummit │ ├── __init __.py │

    ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py 1 directory, 5 files !4
  2. 6.

    $ tree devsummit/ devsummit/ ├── blog │ ├── migrations │

    │ └── __init __.py │ ├── __init __.py │ ├── admin.py │ ├── apps.py │ ├── models.py │ ├── tests.py │ └── views.py ├── devsummit │ ├── __init __.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py 3 directories, 12 files !6
  3. 7.

    $ tree devsummit/ devsummit/ ├── blog │ ├── migrations │

    │ └── __init __.py │ ├── __init __.py │ ├── admin.py │ ├── apps.py │ ├── models.py │ ├── tests.py │ └── views.py ├── devsummit │ ├── __init __.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py 3 directories, 12 files ? !7
  4. 8.

    # SECURITY WARNING: keep the secret key used in production

    secret! SECRET_KEY = 'lzir%8bs)t_dw#9-h(qt+(*6o27s6!ba+l&1*g%iypemvk%8zo' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } !8
  5. 9.

    # SECURITY WARNING: keep the secret key used in production

    secret! SECRET_KEY = 'lzir%8bs)t_dw#9-h(qt+(*6o27s6!ba+l&1*g%iypemvk%8zo' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } !9
  6. 10.
  7. 11.

    Paket Bağımlılıkları PRODUCTION STAGING TEST DEVELOPMENT CI/CD Django ==2.2 ipython

    ==7.4.0 django-debug-toolbar ==1.11 coverage ==4.5.3 whitenoise ==4.1.2 pylint ==2.3.1 !11
  8. 12.

    $ tree blog/ blog/ ├── migrations │ └── __init __.py

    ├── __init __.py ├── admin.py ├── apps.py ├── models.py ├── tests.py └── views.py !12
  9. 13.

    Uygulama Soruları ? Kaç tane uygulama olmalı Kaç tane model

    olmalı Kaç tane view olmalı Testler nasıl organize edilmeli !13
  10. 14.

    Eğer tek bir "app" içinde 20+ model varsa, uygulamanız birden

    fazla şeyi yapıyor anlamına gelir. Bu durumda uygulamanızı parçalayıp uygulama başına düşen model sayısını da azaltmanız önerilir. Chapter 6: Model Best Pratices !14
  11. 15.

    Yeni Proje Oluşturma Aşaması Son yaptığın projeyi clone'la ? Önce

    yeni versiyon Django ile proje oluştur, daha sonra en son yaptığın projenin settings'inden kopyala ? !15
  12. 17.

    !17

  13. 19.

    $ tree -L 1 devsummit/ devsummit/ ├── app ├── bin

    ├── config ├── db ├── lib ├── log ├── public ├── storage ├── test ├── tmp ├── vendor ├── Gemfile ├── Gemfile.lock ├── README.md ├── Rakefile ├── config.ru └── package.json 11 directories, 6 files !19
  14. 20.

    $ tree devsummit/ devsummit/ ├── app │ ├── assets │

    │ ├── config │ │ │ └── manifest.js │ │ ├── images │ │ ├── javascripts │ │ │ ├── channels │ │ │ ├── application.js │ │ │ └── cable.js │ │ └── stylesheets │ │ └── application.css │ ├── channels │ │ └── application_cable │ │ ├── channel.rb │ │ └── connection.rb │ ├── controllers │ │ ├── concerns │ │ └── application_controller.rb │ ├── helpers │ │ └── application_helper.rb │ ├── jobs │ │ └── application_job.rb │ ├── mailers │ │ └── application_mailer.rb │ ├── models │ │ ├── concerns │ │ └── application_record.rb │ └── views │ └── layouts │ ├── application.html.erb │ ├── mailer.html.erb │ └── mailer.text.erb ├── bin │ ├── bundle │ ├── rails │ ├── rake │ ├── setup │ ├── spring │ ├── update │ └── yarn ├── config │ ├── environments │ │ ├── development.rb │ │ ├── production.rb │ │ └── test.rb │ ├── initializers │ │ ├── application_controller_renderer.rb │ │ ├── assets.rb │ │ ├── backtrace_silencers.rb │ │ ├── content_security_policy.rb │ │ ├── cookies_serializer.rb │ │ ├── filter_parameter_logging.rb │ │ ├── inflections.rb │ │ ├── mime_types.rb │ │ └── wrap_parameters.rb │ ├── locales │ │ └── en.yml │ ├── application.rb │ ├── boot.rb │ ├── cable.yml │ ├── credentials.yml.enc │ ├── database.yml │ ├── environment.rb │ ├── master.key │ ├── puma.rb │ ├── routes.rb │ ├── spring.rb │ └── storage.yml ├── db │ └── seeds.rb ├── lib │ ├── assets │ └── tasks ├── log ├── public │ ├── 404.html │ ├── 422.html │ ├── 500.html │ ├── apple-touch-icon-precomposed.png │ ├── apple-touch-icon.png │ ├── favicon.ico │ └── robots.txt ├── storage ├── test │ ├── controllers │ ├── fixtures │ │ └── files │ ├── helpers │ ├── integration │ ├── mailers │ ├── models │ ├── system │ ├── application_system_test_case.rb │ └── test_helper.rb ├── tmp │ ├── cache │ │ └── assets │ └── storage ├── vendor ├── Gemfile ├── Gemfile.lock ├── README.md ├── Rakefile ├── config.ru └── package.json 44 directories, 61 files !20
  15. 22.

    class CreatePosts < ActiveRecord ::Migration[5.2] def change create_table :posts do

    |t| t.string :title t.text :body t.timestamps end end end Migration Model Controller (View) View (Template) !22
  16. 23.

    !23

  17. 24.

    Rails ile Hazır Gelenler • Ortam izolasyonu: "config/environments/" • Ortama

    göre paket organizasyonu: "Gemfile" • Tek "app" kavramı: "app/" • Model "app/models/" altında !24
  18. 25.

    Rails ile Hazır Gelenler • Controller (View) "app/controllers" altında •

    Migration'lar proje kapsamında "db/migrate" altında • Tesler'ler projre kampsamında "test/" altında • Management komutları: "Rakefile" / Rake Task * !25
  19. 26.

    Rake • Makefile'ın Ruby'cesi • macOS sürümleriyle birlikte geliyor •

    101 seviyesinde Ruby yeterli :) • Jim Weirich (1956-2014) !26
  20. 27.

    Rakefile task :default => [:run_server] task :check_django_environment do abort "Set

    DJANGO_ENV variable! via export DJANGO_ENV= ..." unless ENV['DJANGO_ENV'] end task :check_development_environment => [:check_django_environment] do abort "Set DJANGO_ENV to development" unless ENV['DJANGO_ENV'] == 'development' end desc "Run server" task :run_server => [:check_development_environment] do system "DJANGO_COLORS='dark' python manage.py runserver_plus --nothreading" end !27
  21. 28.

    Hayalimdeki Yapı • Ortam izolasyonu hazır olsa (dev/prod/stage/test ...) •

    Kolay model/view/template üretebilsem ... • Rails'deki "routes" gibi "urls.py" ı yönetsem ... • Rails'deki gibi proje yapısı olsa tek yerden erişsem ... • Temel bir modelim olsa, olmazsa olmaz field'ları barındırsa ... • Ortama göre paketleri düzenleyebilsem? (dev.pip, prod.pip ...) • Sık kullandığım paketler içinde olsa ...(django-debug-toolbar gibi) • Diğer yaptığım ve hep kullandığım tool'cuklarım da içinde olsa ... !28
  22. 30.

    Django Project Starter Template • Özelleştirilebilir Custom User modeli •

    BaseModel ve BaseModelWithSoftDelete * modelleri • Yeni proje dosya/dizin yapısı • Ortam ve paket izolasyonu • App ve Model üretmek için Rake task'leri (Management Commands) !30
  23. 31.

    Django Project Starter Template • Migration yönetimi için Rake task'leri

    (Management Commands) • Sadeleştirilmiş development logger • Debug için (console ve html seviyesinde) araçlar • Admin için yardımcı Widget'lar ve Storage • bulma.io entegrasyonu !31
  24. 32.

    Django Project Starter Template • flake8, pylint, black, isort, bandit

    konfigürasyonu • Gelişmiş REPL desteği (ipython/ bpython) - django-extensions ==2.1.6 • Hazır LOCALE sözlük çatısı • CustomLocaleMiddleware ile kolay i18n • HEROKU'ya hızlı deploy ... !32
  25. 33.

    Django Project Starter Template !33 $ tree -L 2 .

    ├── applications │ └── baseapp ├── config │ ├── settings │ ├── __init __.py │ ├── urls.py │ └── wsgi.py ├── db ├── locale │ └── tr ├── media │ └── avatar ├── requirements │ ├── base.pip │ ├── development.pip │ ├── heroku.pip │ └── travis.pip ├── static │ └── css ├── templates │ ├── admin │ ├── baseapp │ └── base.html ├── LICENSE.txt ├── Procfile ├── README.md ├── Rakefile ├── install.sh ├── manage.py ├── pyproject.toml ├── requirements.txt └── runtime.txt 15 directories, 17 files ├── settings │ ├── __init __.py │ ├── base.py │ ├── development.example.py │ ├── development.py │ ├── heroku.py │ ├── production.py │ ├── test.example.py │ ├── test.py │ └── travis.py
  26. 35.

    Django Project Starter Template $ python manage.py create_model blog Category

    softdelete $ rake new:model[blog,Category,softdelete] !35
  27. 37.

    Django Project Starter Template $ rake -T rake db:migrate[database] #

    Run migration for given database (default: 'default') rake db:roll_back[name_of_application,name_of_migration] # Roll-back (name of application, name of migration) rake db:shell # run database shell .. rake db:show[name_of_application] # Show migrations for an application (default: 'all') rake db:update[name_of_application,name_of_migration,is_empty] # Update migration (name of application, name of migration?, is empty?) rake locale:compile # Compile locale dictionary rake locale:update # Update locale dictionary rake new:application[name_of_application] # Create new Django application rake new:model[name_of_application,name_of_model,type_of_model] # Create new Model for given application: django,basemodel,softdelete rake run_server # Run server rake shell[repl] # Run shell+ avail: ipython,bpython default: ipython rake test:browse_coverage[port] # Browse test coverage rake test:coverage[cli_args] # Show test coverage (default: ' --show-missing --ignore-errors --skip-covered') rake test:run[name_of_application,verbose] # Run tests for given application !37
  28. 38.

    Django Project Starter Template $ rake db:show[core] core [X] 0001_models

    [X] 0002_add __article_title __field_to_person [X] 0003_add __article_description __to_person [X] 0004_add __staff __to_program [X] 0005_fix_person [X] 0006_add_duty_to_person_and_title_is_nullable !38
  29. 39.

    Django Project Starter Template $ rake db:roll_back[core,4] Operations to perform:

    Target specific migration: 0004_add __staff __to_program, from core Running migrations: Rendering model states ... DONE Unapplying core.0006_add_duty_to_person_and_title_is_nullable ... OK Unapplying core.0005_fix_person ... OK !39
  30. 40.

    Django Project Starter Template $ rake db:show[core] core [X] 0001_models

    [X] 0002_add __article_title __field_to_person [X] 0003_add __article_description __to_person [X] 0004_add __staff __to_program [ ] 0005_fix_person [ ] 0006_add_duty_to_person_and_title_is_nullable !40
  31. 41.

    Django Project Starter Template $ rake db:roll_back[core,6] Operations to perform:

    Target specific migration: 0006_add_duty_to_person_and_title_is_nullable, from core Running migrations: Applying core.0005_fix_person ... OK Applying core.0006_add_duty_to_person_and_title_is_nullable ... OK !41
  32. 49.

    Django Project Starter Template TODO • Rails'deki gibi scaffold generator

    • Management command için generator • 404/500 Error sayfaları • Rich Text Editor / TextArea (Widget) • Dockerfile rake new:model[blog,Post,softdelete] title:string body:text author:User !49
  33. 51.

    Krediler • Django logosu / djangoproject.com/community/logos • Ruby on Rails

    logosu / rubyonrails.org • Two Scoops of Django / @pydanny • Cookiecutter / Audrey Roy Greenfeld • Jim Weirich fotoğrafı confreaks.tv !51
  34. 52.

    Linkler • https: // www.djangoproject.com • https: //rubyonrails.org • https:

    //github.com/ruby/rake • https: //github.com/audreyr/cookiecutter/ • https: //github.com/pydanny/cookiecutter-django • https: // www.twoscoopspress.com • https: //github.com/vigo/django2-project-template • https: //l.vigo.io/d2pst !52