Just Django
698 subscribers
6 photos
11 files
135 links
Я django senior разработчик, который любит обучать других. Здесь вы узнаете, как создавать приложения на django и как стать отличным django разработчиком!

Сотрудничество - @S0mebo0dy
Download Telegram
В Django есть встроенная система аутентификации, которая работает великолепнo.

Например, если вы обрабатываете двойное подтверждение по электронной почте и не хотите позволять пользователям без подтвержденного адреса электронной почты входить в приложение, вы можете сделать что-то вроде этого:

forms.py:
from django import forms
from django.contrib.auth.forms import AuthenticationForm

class CustomAuthenticationForm(AuthenticationForm):
def confirm_login_allowed(self, user):
if not user.is_active or not user.is_validated:
raise forms.ValidationError('There was a problem with your login.', code='invalid_login')

urls.py:
from django.conf.urls import url
from django.contrib.auth import views as auth_views

from .forms import CustomAuthenticationForm

urlpatterns = [
url(r'^login/$', auth_views.login, {'template_name': 'core/login.html',
'authentication_form': CustomAuthenticationForm}, name='login'),
url(r'^logout/$', auth_views.logout, name='logout'),
...
]

В основном это просто вопрос переопределения метода confirm_login_allowed и замены параметра authentication_form новой формой в urlconf. Вы можете добавить любую политику входа в систему, а чтобы сделать аутентификацию недействительной, просто вызовите ValidationError.

Для встроенных вьюшeк входа в систему Django использует форму django.contrib.auth.forms.AuthenticationForm для обработки процесса аутентификации. В основном он проверяет username, password и is_active.

Django упрощает добавление пользовательских проверок, поскольку AuthenticationForm имеет метод с именем confirm_login_allowed (user).
Были ли у вас ситуации, когда вы спорили с кем-то о том, какой фреймворк лучший - Django или Laravel?

В таких ситуациях вам нужно знать каждый аспект, если даже ваш фреймворк хуже, вы должны, хотя бы, не показывать это своему оппоненту, а лучше если вы выиграете спор😏.

Но как узнать все подробности? Я только что написал об этом статью. Надеюсь, с помощью этой статьи в следующий раз, ты поставите этих Laravel разработчиков на их место😎.
Лучшие книги о Django (на английском)

1. Django for APIs: Build web APIs with Python & Django

2. Two Scoops of Django 1.11: Best Practices for the Django Web Framework

3. Django for Professionals: Production websites with Python & Django

4. Django for Beginners: Build websites with Python and Django

5. Django 2 by Example

6. Django Design Patterns and Best Practices

7. Django Unleashed

8. Beginning Django E-Commerce

9. Lightweight Django 1st Edition

10. Practical Django 2 and Channels 2
#useful_stuff

Наследование абстрактного базового класса

Этот стиль используется, когда вы хотите, чтобы родительский класс содержал информацию, которую вы не хотите вводить для каждой дочерней модели.

# models.py


from django.db import models

# Create your models here.

class ContactInfo(models.Model):
name=models.CharField(max_length=20)
email=models.EmailField(max_length=20)
address=models.TextField(max_length=20)

class Meta:
abstract=True

class Customer(ContactInfo):
phone=models.IntegerField(max_length=15)

class Staff(ContactInfo):
position=models.CharField(max_length=10)

# admin.py


admin.site.register(Customer)
admin.site.register(Staff)

Когда мы переносим эти изменения, в базе данных создаются две таблицы.
В таблице Custmoer у нас есть поля: name, email, addess и phone.
В таблице Staff есть поля: name, email, address и position.

Таблица базового класса не создается в этом наследовании.
#useful_stuff

Наследование многотабличной модели

Этот стиль используется, если вы разделяете существующую модель на подклассы и хотите, чтобы каждая модель имела свою собственную таблицу базы данных.

# models.py

from django.db import models

# Create your models here.

class Place(models.Model):
name=models.CharField(max_length=20)
address=models.TextField(max_length=20)

def __str__(self):
return self.name


class Restaurants(Place):
serves_pizza=models.BooleanField(default=False)
serves_pasta=models.BooleanField(default=False)

def __str__(self):
return self.serves_pasta

# admins.py

from django.contrib import admin
from .models import Place,Restaurants
# Register your models here.

admin.site.register(Place)
admin.site.register(Restaurants)

В этом наследовании также создается таблица базового класса.
Oн создаст отношение модели один к одному для таблицы Restaurants из таблицы Place.
#useful_stuff

Наследование прокси-модели

Этот стиль используется, если вы хотите только изменить поведение модели на уровне Python без изменения полей модели.

Вы наследуете от базового класса и можете добавлять свои собственные свойства, кроме полей.

Базовый класс не должен быть абстрактным классом.

Мы не можем использовать множественное наследование в прокси-моделях.

Основное использование - перезапись основных функций существующей модели.

# models.py
from django.db import models

# Create your models here.

class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)

class MyPerson(Person):
class Meta:
proxy = True

def fullName(self):
return self.first_name + " " + self.last_name

Класс MyPerson работает с той же таблицей базы данных, что и его родительский класс Person.

В частности, любые новые экземпляры Person также будут доступны через MyPerson, и наоборот:

In [1]: from MyApp.models import Person, MyPerson

In [2]: p = Person(first_name = "Anton", last_name = "Anton")

In [3]: p.save()

После добавления данных теперь мы можем получить доступ к first_name и last_name с помощью метода fullName() класса MyPerson.

In [7]: myperson = MyPerson.objects.all()[0]

In [8]: myperson.fullName()
Out[8]: 'Anton Anton'
MongoDB становится все более популярным. И я считаю это правильным, потому что за NoSQL будущее.

Итак, как насчет нас (django разработчиков ), есть ли у нас способ использовать MongoDB?

Ну, у нас нет одного, у нас их 3. Если вам интересно, то читайте подробнее здесь.
Лучшие каналы o Django на YouTube (на английском языке):

- CodingEntrepreneurs
- Corey Schafer
- Dennis Ivy
- Programming with Harry
- Codemy .com
- Code With Stein
- Very Academy
- Telusko
#useful_stuff

Вкратце о MongoDB:

import pymongo
#connect_string = 'localhost'

from django.conf import settings
my_client = pymongo.MongoClient(connect_string, 27017)

# Сначала определите имя базы данных
dbname = my_client['sample_medicines']

# Теперь получите / создайте имя коллекции (помните, что вы увидите базу данных в своем кластере mongodb только после создания коллекции
collection_name = dbname["medicinedetails"]

# давайте создадим два документа
medicine_1 = {
"medicine_id": "RR000123456",
"common_name" : "Paracetamol",
"scientific_name" : "",
"available" : "Y",
"category": "fever"
}
medicine_2 = {
"medicine_id": "RR000342522",
"common_name" : "Metformin",
"scientific_name" : "",
"available" : "Y",
"category" : "type 2 diabetes"
}
# Вставьте документы

collection_name.insert_many([medicine_1,medicine_2])
# Проверить count
count = collection_name.count()
print(count)

# Прочтите документы
med_details = collection_name.find({})
# Распечатать в терминале
for r in med_details:
print(r["common_name"])
# Обновить один документ
update_data = collection_name.update_one({'medicine_id':'RR000123456'}, {'$set':{'common_name':'Paracetamol 500'}})

# Удалить один документ
delete_data = collection_name.delete_one({'medicine_id':'RR000123456'})
Личный совет от меня - изучайте Celery и Reddis.

Эти технологии необходимы. Также попробуйте сделать что-нибудь с Django channels, например мессенджер.

Оптимизация приложений Django - необходимость, также необходимо упростить работу для других.

(Это даст вам огромное преимущество перед другими кандидатами на работе, и начальник высоко оценит.)
Классное видео о том, как использовать Django с Data Science

https://www.youtube.com/watch?v=RGjJmi36dno
#Задачи

Интересное задание:

Подключите elastic search и mongo к любому из ваших django проектов.

Сделайте несколько простых запросов и ответьте на вопрос: когда и почему мы используем elasitc search, mongo и postgres?