https://phalt.github.io/django-api-domains/
def get_book(*, id: uuid.UUID) -> Book:
book = Book.objects.get(id=id)
author = AuthorInterface.get_author(id=book.author_id)
return {
'name': book.name,
'author_name': author.name,
}
github.com/mdn/kuma/blob/master/kuma/authkeys/models.py
from django.utils.translation import ugettext_lazy as _
def generate_key():
"""Generate a random API key."""
...
class Key(models.Model):
"""Authentication key"""
...
def generate_secret(self):
self.key = generate_key()
secret = generate_key()
self.hashed_secret = hash_secret(secret)
return secret
// View
@Controller class MyController {
@Inject MyService service;
@GetRequest("/deal") UUID deal(@Valid Deal deal){
service.saveDeal(deal);
// Controller
@Transactional
@Service class MyService {
@Inject Repo1 repo1; @Inject Repo2 repo2;
@Inject Repo3 repo3; @Inject Repo4 repo4;
Result<UUID> deal(Deal deal){
if(/* check */) {}
else(/* check */) {
repo1.save(/* */);
repo2.save(/* */);
}
return /**/;
// Model
@Repository class MyService {
@Inject Datasource ds;
UUID save(Deal deal){
try(var con = ds.getConnection()){
var stmt = con.createStatement("INSERT INTO … RETURNING");
stmt.fetchResult();
return /* */;
Result<UUID>
class MyController(Injector):
my_service = MyService
class MyService(Injector):
repo1 = Repo1
repo2 = Repo2
class Repo1(Injector):
data_source = DataSource
Чтобы не сломать можно использовать seddonym/import-linter
[importlinter]
root_package = mypackage
[importlinter:contract:1]
name = My three-tier layers contract
type = layers
layers=
mypackage.endpoint
mypackage.service
mypackage.repository
Result<UUID>
BEGIN
-COMMIT
а бизнес-сущностьЕсть сторис, который позволяет описать безнес путь
class Subscribe:
@story
@arguments('category_id', 'profile_id')
def buy(I):
I.find_category
I.find_profile
I.check_balance
I.persist_subscription
I.show_subscription
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()
Опять на View
Или это тоже грустное?
В Python все исключения unchecked: фиг поймаешь.
В Java можно поделить
И что?
void someFun(){
try {
instance.call(payload);
} catch (IOException e){
logger.info("Can't write to FS");
} catch (UnknownUserException e){
logger.info("Who am I?")
}
// etc, etc…
}
Всё unchecked, но если очень надо™ — то есть аннотация @Throws
Но есть и хорошие части!
def test_home(self):
with django_perf_rec.record():
self.client.get('/')
записывает все запросы в .yml
файлВиталий Брагилевский о типах
Если нам повезёт — мы будем устанавливать приложение глобально
Если нам повезёт — в setup.py будет аналог rm -rf /*
https://pages.charlesreid1.com/dont-sudo-pip/
А даже если не sudo
— эта штука может сотворить всё что угодно!
И от этого не спастись!
pip install safety
Эта штука может проверить уже добавленные библиотеки
Но в целом Safety - это линтер. А линтеры — это хорошо.
Никита Воронов про ад с зависимостями
asm0dey @ Facebook, Telegram
asm0di0 @ Twitter
it.asm0dey.ru
asm0dey@asm0dey.ru