sendgo-django 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sendgo_django-1.0.0/LICENSE +21 -0
- sendgo_django-1.0.0/PKG-INFO +297 -0
- sendgo_django-1.0.0/README.md +270 -0
- sendgo_django-1.0.0/pyproject.toml +38 -0
- sendgo_django-1.0.0/sendgo_django/__init__.py +37 -0
- sendgo_django-1.0.0/sendgo_django/apps.py +25 -0
- sendgo_django-1.0.0/sendgo_django/conf.py +62 -0
- sendgo_django-1.0.0/sendgo_django.egg-info/PKG-INFO +297 -0
- sendgo_django-1.0.0/sendgo_django.egg-info/SOURCES.txt +11 -0
- sendgo_django-1.0.0/sendgo_django.egg-info/dependency_links.txt +1 -0
- sendgo_django-1.0.0/sendgo_django.egg-info/requires.txt +2 -0
- sendgo_django-1.0.0/sendgo_django.egg-info/top_level.txt +1 -0
- sendgo_django-1.0.0/setup.cfg +4 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sendgo <dev@sendgo.io>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sendgo-django
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Sendgo Django 확장 — 카카오 알림톡/친구톡, SMS/LMS/MMS
|
|
5
|
+
Author-email: Sendgo <dev@sendgo.io>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://sendgo.io
|
|
8
|
+
Project-URL: Repository, https://github.com/send-go/django
|
|
9
|
+
Keywords: sendgo,django,kakao,alimtalk,sms,notification,korea
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
|
+
Classifier: Environment :: Web Environment
|
|
12
|
+
Classifier: Framework :: Django
|
|
13
|
+
Classifier: Framework :: Django :: 4.2
|
|
14
|
+
Classifier: Framework :: Django :: 5.0
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: sendgo-python>=1.0
|
|
25
|
+
Requires-Dist: Django>=4.2
|
|
26
|
+
Dynamic: license-file
|
|
27
|
+
|
|
28
|
+
# sendgo-django
|
|
29
|
+
|
|
30
|
+
> **Django에서 카카오 알림톡, 친구톡, SMS를 가장 쉽게 발송하는 공식 Django 확장 패키지**
|
|
31
|
+
|
|
32
|
+
[](https://pypi.org/project/sendgo-django/)
|
|
33
|
+
[](https://www.djangoproject.com)
|
|
34
|
+
[](https://python.org)
|
|
35
|
+
[](LICENSE)
|
|
36
|
+
|
|
37
|
+
`sendgo-django`는 [`sendgo-python`](https://github.com/send-go/python) 코어를 확장한 **Django 전용 패키지**입니다.
|
|
38
|
+
`settings.SENDGO` 설정 기반의 클라이언트 생성, 지연 로딩 프록시(`client`), AppConfig 통합을 제공합니다.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 목차
|
|
43
|
+
|
|
44
|
+
- [설치](#설치)
|
|
45
|
+
- [빠른 시작](#빠른-시작)
|
|
46
|
+
- [프록시 사용법](#프록시-사용법)
|
|
47
|
+
- [상세 사용법](#상세-사용법)
|
|
48
|
+
- [알림톡](#알림톡)
|
|
49
|
+
- [친구톡](#친구톡)
|
|
50
|
+
- [SMS / LMS / MMS](#sms--lms--mms)
|
|
51
|
+
- [서비스 클래스 패턴](#서비스-클래스-패턴)
|
|
52
|
+
- [예외 처리](#예외-처리)
|
|
53
|
+
- [설정 옵션](#설정-옵션)
|
|
54
|
+
- [자주 묻는 질문](#자주-묻는-질문-faq)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 설치
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install sendgo-django
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`sendgo-python` 코어는 의존성으로 자동 설치됩니다.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 빠른 시작
|
|
69
|
+
|
|
70
|
+
### 1단계 — `INSTALLED_APPS` 등록 (`settings.py`)
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
INSTALLED_APPS += ["sendgo_django"]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 2단계 — `SENDGO` 설정 추가 (`settings.py`)
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
import os
|
|
80
|
+
|
|
81
|
+
SENDGO = {
|
|
82
|
+
"ACCESS_KEY": os.environ["SENDGO_ACCESS_KEY"],
|
|
83
|
+
"SECRET_KEY": os.environ["SENDGO_SECRET_KEY"],
|
|
84
|
+
"KAKAO_SENDER_KEY": os.environ.get("SENDGO_KAKAO_SENDER_KEY"),
|
|
85
|
+
"SMS_SENDER_KEY": os.environ.get("SENDGO_SMS_SENDER_KEY"),
|
|
86
|
+
"API_VERSION": "v2",
|
|
87
|
+
# "BASE_URL": "https://sendgo.io", # 기본값
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 3단계 — 뷰에서 알림톡 전송
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
# views.py
|
|
95
|
+
from django.http import JsonResponse
|
|
96
|
+
from sendgo_django import client
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def confirm_order(request, order_id):
|
|
100
|
+
order = get_order(order_id)
|
|
101
|
+
|
|
102
|
+
client.alimtalk.send(
|
|
103
|
+
template_code="ORDER_CONFIRM_001",
|
|
104
|
+
contacts=[
|
|
105
|
+
{
|
|
106
|
+
"contact": order.phone,
|
|
107
|
+
"name": order.name,
|
|
108
|
+
"var1": order.number,
|
|
109
|
+
"var2": f"{order.total:,}원",
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
return JsonResponse({"success": True})
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 프록시 사용법
|
|
120
|
+
|
|
121
|
+
`sendgo_django.client`는 `SimpleLazyObject` 기반 **지연 로딩 프록시**입니다.
|
|
122
|
+
패키지를 임포트하는 시점에는 클라이언트를 생성하지 않고, 실제로 속성에 접근할 때
|
|
123
|
+
`get_client()`를 호출합니다. 따라서 설정이 없어도 임포트만으로는 오류가 나지 않습니다.
|
|
124
|
+
|
|
125
|
+
```python
|
|
126
|
+
from sendgo_django import client
|
|
127
|
+
|
|
128
|
+
# 알림톡 발송
|
|
129
|
+
client.alimtalk.send(
|
|
130
|
+
template_code="ORDER_CONFIRM_001",
|
|
131
|
+
contacts=[{"contact": "01012345678", "var1": "ORD-001"}],
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# SMS 발송
|
|
135
|
+
client.sms.send_sms(
|
|
136
|
+
content="[인증] 인증번호: 123456",
|
|
137
|
+
contacts=[{"contact": "01012345678"}],
|
|
138
|
+
)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
명시적으로 인스턴스를 얻고 싶다면 `get_client()`를 직접 호출할 수 있습니다.
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
from sendgo_django import get_client
|
|
145
|
+
|
|
146
|
+
sendgo = get_client()
|
|
147
|
+
sendgo.friendtalk.send(content="안녕하세요!", contacts=[{"contact": "01012345678"}])
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 상세 사용법
|
|
153
|
+
|
|
154
|
+
### 알림톡
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
from sendgo_django import client
|
|
158
|
+
|
|
159
|
+
# 다건 발송
|
|
160
|
+
client.alimtalk.send(
|
|
161
|
+
template_code="ORDER_CONFIRM_001",
|
|
162
|
+
contacts=[
|
|
163
|
+
{"contact": "01011111111", "name": "홍길동", "var1": "ORD-001", "var2": "29,000원"},
|
|
164
|
+
{"contact": "01022222222", "name": "김철수", "var1": "ORD-002", "var2": "15,000원"},
|
|
165
|
+
],
|
|
166
|
+
)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 친구톡
|
|
170
|
+
|
|
171
|
+
```python
|
|
172
|
+
from sendgo_django import client
|
|
173
|
+
|
|
174
|
+
# 텍스트형
|
|
175
|
+
client.friendtalk.send(
|
|
176
|
+
content="안녕하세요! 7월 한정 특가 이벤트를 확인해보세요.",
|
|
177
|
+
contacts=[{"contact": "01012345678"}],
|
|
178
|
+
)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### SMS / LMS / MMS
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
from sendgo_django import client
|
|
185
|
+
|
|
186
|
+
# SMS (90자 이하)
|
|
187
|
+
client.sms.send_sms(
|
|
188
|
+
content="[Sendgo] 인증번호: 123456 (5분 이내 입력)",
|
|
189
|
+
contacts=[{"contact": "01012345678"}],
|
|
190
|
+
)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 서비스 클래스 패턴
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
# app/services.py
|
|
199
|
+
import logging
|
|
200
|
+
|
|
201
|
+
from sendgo import SendgoError
|
|
202
|
+
from sendgo_django import client
|
|
203
|
+
|
|
204
|
+
logger = logging.getLogger(__name__)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class NotificationService:
|
|
208
|
+
"""알림 발송 로직을 캡슐화한 서비스 클래스."""
|
|
209
|
+
|
|
210
|
+
def send_order_confirm(self, phone: str, order_no: str, amount: int) -> None:
|
|
211
|
+
client.alimtalk.send(
|
|
212
|
+
template_code="ORDER_CONFIRM_001",
|
|
213
|
+
contacts=[{"contact": phone, "var1": order_no, "var2": f"{amount:,}원"}],
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
def send_verification_code(self, phone: str, code: str) -> None:
|
|
217
|
+
try:
|
|
218
|
+
client.alimtalk.send(
|
|
219
|
+
template_code="VERIFY_CODE_001",
|
|
220
|
+
contacts=[{"contact": phone, "var1": code}],
|
|
221
|
+
)
|
|
222
|
+
except SendgoError:
|
|
223
|
+
logger.exception("Sendgo 인증번호 발송 실패")
|
|
224
|
+
raise
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 예외 처리
|
|
230
|
+
|
|
231
|
+
```python
|
|
232
|
+
from sendgo import SendgoError
|
|
233
|
+
from sendgo_django import client
|
|
234
|
+
|
|
235
|
+
try:
|
|
236
|
+
client.alimtalk.send(
|
|
237
|
+
template_code="ORDER_CONFIRM_001",
|
|
238
|
+
contacts=[{"contact": "01012345678", "var1": "ORD-001"}],
|
|
239
|
+
)
|
|
240
|
+
except SendgoError as e:
|
|
241
|
+
logger.error("Sendgo 발송 실패: %s", e)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 설정 옵션
|
|
247
|
+
|
|
248
|
+
`settings.SENDGO` 딕셔너리 키:
|
|
249
|
+
|
|
250
|
+
| 키 | 필수 | 기본값 | 설명 |
|
|
251
|
+
|----|------|--------|------|
|
|
252
|
+
| `ACCESS_KEY` | ✅ | — | Sendgo 액세스 키 |
|
|
253
|
+
| `SECRET_KEY` | ✅ | — | Sendgo 시크릿 키 |
|
|
254
|
+
| `KAKAO_SENDER_KEY` | | `None` | 카카오 발신프로필 키 |
|
|
255
|
+
| `SMS_SENDER_KEY` | | `None` | SMS 발신자 키 |
|
|
256
|
+
| `API_VERSION` | | `"v2"` | API 버전 |
|
|
257
|
+
| `BASE_URL` | | `"https://sendgo.io"` | API 기본 URL |
|
|
258
|
+
|
|
259
|
+
`ACCESS_KEY` 또는 `SECRET_KEY`가 없으면 클라이언트 생성 시 `django.core.exceptions.ImproperlyConfigured`가 발생합니다.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 자주 묻는 질문 (FAQ)
|
|
264
|
+
|
|
265
|
+
**Q. `sendgo-python`과의 차이는 무엇인가요?**
|
|
266
|
+
A. `sendgo-python`은 프레임워크 독립적인 순수 Python 코어 패키지입니다. `sendgo-django`는 이를 확장해 `settings.SENDGO` 설정 바인딩, 지연 로딩 프록시, AppConfig 통합을 추가합니다.
|
|
267
|
+
|
|
268
|
+
**Q. 설정 없이 임포트하면 오류가 나나요?**
|
|
269
|
+
A. 아니요. `client`는 지연 프록시이므로 임포트만으로는 오류가 없고, 실제 사용(속성 접근) 시점에 설정을 검증합니다.
|
|
270
|
+
|
|
271
|
+
**Q. 테스트 시 클라이언트를 초기화하려면?**
|
|
272
|
+
A. `sendgo_django.conf.reset()`을 호출하면 메모이즈된 클라이언트가 초기화됩니다.
|
|
273
|
+
|
|
274
|
+
**Q. Django 4.2, 5.x를 지원하나요?**
|
|
275
|
+
A. 네, `Django>=4.2`를 지원합니다.
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## 관련 패키지
|
|
280
|
+
|
|
281
|
+
| 언어/프레임워크 | 패키지 | GitHub |
|
|
282
|
+
|----------------|--------|--------|
|
|
283
|
+
| Python (순수) | `sendgo-python` | [python](https://github.com/send-go/python) |
|
|
284
|
+
| Laravel | `sendgo/laravel` | [laravel](https://github.com/send-go/laravel) |
|
|
285
|
+
| Spring Boot | `io.sendgo:sendgo-spring` | [spring](https://github.com/send-go/spring) |
|
|
286
|
+
| Node.js | `@sendgo/node` | [node](https://github.com/send-go/node) |
|
|
287
|
+
| 전체 목록 | — | [send-go GitHub 조직](https://github.com/send-go) |
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 라이선스
|
|
292
|
+
|
|
293
|
+
MIT License © 2026 [Sendgo](https://sendgo.io)
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
*키워드: 카카오 알림톡 Django, 카카오 친구톡 Django, SMS 발송 Django, 알림톡 Django 패키지, Django 카카오 API 연동, Sendgo Django SDK*
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# sendgo-django
|
|
2
|
+
|
|
3
|
+
> **Django에서 카카오 알림톡, 친구톡, SMS를 가장 쉽게 발송하는 공식 Django 확장 패키지**
|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/sendgo-django/)
|
|
6
|
+
[](https://www.djangoproject.com)
|
|
7
|
+
[](https://python.org)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
10
|
+
`sendgo-django`는 [`sendgo-python`](https://github.com/send-go/python) 코어를 확장한 **Django 전용 패키지**입니다.
|
|
11
|
+
`settings.SENDGO` 설정 기반의 클라이언트 생성, 지연 로딩 프록시(`client`), AppConfig 통합을 제공합니다.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 목차
|
|
16
|
+
|
|
17
|
+
- [설치](#설치)
|
|
18
|
+
- [빠른 시작](#빠른-시작)
|
|
19
|
+
- [프록시 사용법](#프록시-사용법)
|
|
20
|
+
- [상세 사용법](#상세-사용법)
|
|
21
|
+
- [알림톡](#알림톡)
|
|
22
|
+
- [친구톡](#친구톡)
|
|
23
|
+
- [SMS / LMS / MMS](#sms--lms--mms)
|
|
24
|
+
- [서비스 클래스 패턴](#서비스-클래스-패턴)
|
|
25
|
+
- [예외 처리](#예외-처리)
|
|
26
|
+
- [설정 옵션](#설정-옵션)
|
|
27
|
+
- [자주 묻는 질문](#자주-묻는-질문-faq)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 설치
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install sendgo-django
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`sendgo-python` 코어는 의존성으로 자동 설치됩니다.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 빠른 시작
|
|
42
|
+
|
|
43
|
+
### 1단계 — `INSTALLED_APPS` 등록 (`settings.py`)
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
INSTALLED_APPS += ["sendgo_django"]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 2단계 — `SENDGO` 설정 추가 (`settings.py`)
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
import os
|
|
53
|
+
|
|
54
|
+
SENDGO = {
|
|
55
|
+
"ACCESS_KEY": os.environ["SENDGO_ACCESS_KEY"],
|
|
56
|
+
"SECRET_KEY": os.environ["SENDGO_SECRET_KEY"],
|
|
57
|
+
"KAKAO_SENDER_KEY": os.environ.get("SENDGO_KAKAO_SENDER_KEY"),
|
|
58
|
+
"SMS_SENDER_KEY": os.environ.get("SENDGO_SMS_SENDER_KEY"),
|
|
59
|
+
"API_VERSION": "v2",
|
|
60
|
+
# "BASE_URL": "https://sendgo.io", # 기본값
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 3단계 — 뷰에서 알림톡 전송
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
# views.py
|
|
68
|
+
from django.http import JsonResponse
|
|
69
|
+
from sendgo_django import client
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def confirm_order(request, order_id):
|
|
73
|
+
order = get_order(order_id)
|
|
74
|
+
|
|
75
|
+
client.alimtalk.send(
|
|
76
|
+
template_code="ORDER_CONFIRM_001",
|
|
77
|
+
contacts=[
|
|
78
|
+
{
|
|
79
|
+
"contact": order.phone,
|
|
80
|
+
"name": order.name,
|
|
81
|
+
"var1": order.number,
|
|
82
|
+
"var2": f"{order.total:,}원",
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
return JsonResponse({"success": True})
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 프록시 사용법
|
|
93
|
+
|
|
94
|
+
`sendgo_django.client`는 `SimpleLazyObject` 기반 **지연 로딩 프록시**입니다.
|
|
95
|
+
패키지를 임포트하는 시점에는 클라이언트를 생성하지 않고, 실제로 속성에 접근할 때
|
|
96
|
+
`get_client()`를 호출합니다. 따라서 설정이 없어도 임포트만으로는 오류가 나지 않습니다.
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
from sendgo_django import client
|
|
100
|
+
|
|
101
|
+
# 알림톡 발송
|
|
102
|
+
client.alimtalk.send(
|
|
103
|
+
template_code="ORDER_CONFIRM_001",
|
|
104
|
+
contacts=[{"contact": "01012345678", "var1": "ORD-001"}],
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# SMS 발송
|
|
108
|
+
client.sms.send_sms(
|
|
109
|
+
content="[인증] 인증번호: 123456",
|
|
110
|
+
contacts=[{"contact": "01012345678"}],
|
|
111
|
+
)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
명시적으로 인스턴스를 얻고 싶다면 `get_client()`를 직접 호출할 수 있습니다.
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
from sendgo_django import get_client
|
|
118
|
+
|
|
119
|
+
sendgo = get_client()
|
|
120
|
+
sendgo.friendtalk.send(content="안녕하세요!", contacts=[{"contact": "01012345678"}])
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 상세 사용법
|
|
126
|
+
|
|
127
|
+
### 알림톡
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
from sendgo_django import client
|
|
131
|
+
|
|
132
|
+
# 다건 발송
|
|
133
|
+
client.alimtalk.send(
|
|
134
|
+
template_code="ORDER_CONFIRM_001",
|
|
135
|
+
contacts=[
|
|
136
|
+
{"contact": "01011111111", "name": "홍길동", "var1": "ORD-001", "var2": "29,000원"},
|
|
137
|
+
{"contact": "01022222222", "name": "김철수", "var1": "ORD-002", "var2": "15,000원"},
|
|
138
|
+
],
|
|
139
|
+
)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 친구톡
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
from sendgo_django import client
|
|
146
|
+
|
|
147
|
+
# 텍스트형
|
|
148
|
+
client.friendtalk.send(
|
|
149
|
+
content="안녕하세요! 7월 한정 특가 이벤트를 확인해보세요.",
|
|
150
|
+
contacts=[{"contact": "01012345678"}],
|
|
151
|
+
)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### SMS / LMS / MMS
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
from sendgo_django import client
|
|
158
|
+
|
|
159
|
+
# SMS (90자 이하)
|
|
160
|
+
client.sms.send_sms(
|
|
161
|
+
content="[Sendgo] 인증번호: 123456 (5분 이내 입력)",
|
|
162
|
+
contacts=[{"contact": "01012345678"}],
|
|
163
|
+
)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 서비스 클래스 패턴
|
|
169
|
+
|
|
170
|
+
```python
|
|
171
|
+
# app/services.py
|
|
172
|
+
import logging
|
|
173
|
+
|
|
174
|
+
from sendgo import SendgoError
|
|
175
|
+
from sendgo_django import client
|
|
176
|
+
|
|
177
|
+
logger = logging.getLogger(__name__)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class NotificationService:
|
|
181
|
+
"""알림 발송 로직을 캡슐화한 서비스 클래스."""
|
|
182
|
+
|
|
183
|
+
def send_order_confirm(self, phone: str, order_no: str, amount: int) -> None:
|
|
184
|
+
client.alimtalk.send(
|
|
185
|
+
template_code="ORDER_CONFIRM_001",
|
|
186
|
+
contacts=[{"contact": phone, "var1": order_no, "var2": f"{amount:,}원"}],
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
def send_verification_code(self, phone: str, code: str) -> None:
|
|
190
|
+
try:
|
|
191
|
+
client.alimtalk.send(
|
|
192
|
+
template_code="VERIFY_CODE_001",
|
|
193
|
+
contacts=[{"contact": phone, "var1": code}],
|
|
194
|
+
)
|
|
195
|
+
except SendgoError:
|
|
196
|
+
logger.exception("Sendgo 인증번호 발송 실패")
|
|
197
|
+
raise
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 예외 처리
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
from sendgo import SendgoError
|
|
206
|
+
from sendgo_django import client
|
|
207
|
+
|
|
208
|
+
try:
|
|
209
|
+
client.alimtalk.send(
|
|
210
|
+
template_code="ORDER_CONFIRM_001",
|
|
211
|
+
contacts=[{"contact": "01012345678", "var1": "ORD-001"}],
|
|
212
|
+
)
|
|
213
|
+
except SendgoError as e:
|
|
214
|
+
logger.error("Sendgo 발송 실패: %s", e)
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 설정 옵션
|
|
220
|
+
|
|
221
|
+
`settings.SENDGO` 딕셔너리 키:
|
|
222
|
+
|
|
223
|
+
| 키 | 필수 | 기본값 | 설명 |
|
|
224
|
+
|----|------|--------|------|
|
|
225
|
+
| `ACCESS_KEY` | ✅ | — | Sendgo 액세스 키 |
|
|
226
|
+
| `SECRET_KEY` | ✅ | — | Sendgo 시크릿 키 |
|
|
227
|
+
| `KAKAO_SENDER_KEY` | | `None` | 카카오 발신프로필 키 |
|
|
228
|
+
| `SMS_SENDER_KEY` | | `None` | SMS 발신자 키 |
|
|
229
|
+
| `API_VERSION` | | `"v2"` | API 버전 |
|
|
230
|
+
| `BASE_URL` | | `"https://sendgo.io"` | API 기본 URL |
|
|
231
|
+
|
|
232
|
+
`ACCESS_KEY` 또는 `SECRET_KEY`가 없으면 클라이언트 생성 시 `django.core.exceptions.ImproperlyConfigured`가 발생합니다.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 자주 묻는 질문 (FAQ)
|
|
237
|
+
|
|
238
|
+
**Q. `sendgo-python`과의 차이는 무엇인가요?**
|
|
239
|
+
A. `sendgo-python`은 프레임워크 독립적인 순수 Python 코어 패키지입니다. `sendgo-django`는 이를 확장해 `settings.SENDGO` 설정 바인딩, 지연 로딩 프록시, AppConfig 통합을 추가합니다.
|
|
240
|
+
|
|
241
|
+
**Q. 설정 없이 임포트하면 오류가 나나요?**
|
|
242
|
+
A. 아니요. `client`는 지연 프록시이므로 임포트만으로는 오류가 없고, 실제 사용(속성 접근) 시점에 설정을 검증합니다.
|
|
243
|
+
|
|
244
|
+
**Q. 테스트 시 클라이언트를 초기화하려면?**
|
|
245
|
+
A. `sendgo_django.conf.reset()`을 호출하면 메모이즈된 클라이언트가 초기화됩니다.
|
|
246
|
+
|
|
247
|
+
**Q. Django 4.2, 5.x를 지원하나요?**
|
|
248
|
+
A. 네, `Django>=4.2`를 지원합니다.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## 관련 패키지
|
|
253
|
+
|
|
254
|
+
| 언어/프레임워크 | 패키지 | GitHub |
|
|
255
|
+
|----------------|--------|--------|
|
|
256
|
+
| Python (순수) | `sendgo-python` | [python](https://github.com/send-go/python) |
|
|
257
|
+
| Laravel | `sendgo/laravel` | [laravel](https://github.com/send-go/laravel) |
|
|
258
|
+
| Spring Boot | `io.sendgo:sendgo-spring` | [spring](https://github.com/send-go/spring) |
|
|
259
|
+
| Node.js | `@sendgo/node` | [node](https://github.com/send-go/node) |
|
|
260
|
+
| 전체 목록 | — | [send-go GitHub 조직](https://github.com/send-go) |
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## 라이선스
|
|
265
|
+
|
|
266
|
+
MIT License © 2026 [Sendgo](https://sendgo.io)
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
*키워드: 카카오 알림톡 Django, 카카오 친구톡 Django, SMS 발송 Django, 알림톡 Django 패키지, Django 카카오 API 연동, Sendgo Django SDK*
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "sendgo-django"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Sendgo Django 확장 — 카카오 알림톡/친구톡, SMS/LMS/MMS"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = {text = "MIT"}
|
|
11
|
+
authors = [{name = "Sendgo", email = "dev@sendgo.io"}]
|
|
12
|
+
keywords = ["sendgo", "django", "kakao", "alimtalk", "sms", "notification", "korea"]
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Development Status :: 5 - Production/Stable",
|
|
15
|
+
"Environment :: Web Environment",
|
|
16
|
+
"Framework :: Django",
|
|
17
|
+
"Framework :: Django :: 4.2",
|
|
18
|
+
"Framework :: Django :: 5.0",
|
|
19
|
+
"Intended Audience :: Developers",
|
|
20
|
+
"License :: OSI Approved :: MIT License",
|
|
21
|
+
"Programming Language :: Python :: 3",
|
|
22
|
+
"Programming Language :: Python :: 3.10",
|
|
23
|
+
"Programming Language :: Python :: 3.11",
|
|
24
|
+
"Programming Language :: Python :: 3.12",
|
|
25
|
+
]
|
|
26
|
+
requires-python = ">=3.10"
|
|
27
|
+
dependencies = [
|
|
28
|
+
"sendgo-python>=1.0",
|
|
29
|
+
"Django>=4.2",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
Homepage = "https://sendgo.io"
|
|
34
|
+
Repository = "https://github.com/send-go/django"
|
|
35
|
+
|
|
36
|
+
[tool.setuptools.packages.find]
|
|
37
|
+
where = ["."]
|
|
38
|
+
include = ["sendgo_django*"]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Sendgo Django 확장 — 카카오 알림톡/친구톡, SMS/LMS/MMS
|
|
3
|
+
|
|
4
|
+
Django 프로젝트에서 Sendgo 코어(`sendgo-python`)를 손쉽게 사용할 수 있도록
|
|
5
|
+
설정 기반의 클라이언트 생성과 지연 로딩 프록시를 제공합니다.
|
|
6
|
+
|
|
7
|
+
사용법:
|
|
8
|
+
# settings.py
|
|
9
|
+
INSTALLED_APPS += ["sendgo_django"]
|
|
10
|
+
|
|
11
|
+
SENDGO = {
|
|
12
|
+
"ACCESS_KEY": "your_access_key",
|
|
13
|
+
"SECRET_KEY": "your_secret_key",
|
|
14
|
+
"KAKAO_SENDER_KEY": "your_kakao_key",
|
|
15
|
+
"SMS_SENDER_KEY": "your_sms_key",
|
|
16
|
+
"API_VERSION": "v2",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
# views.py
|
|
20
|
+
from sendgo_django import client
|
|
21
|
+
|
|
22
|
+
client.alimtalk.send(
|
|
23
|
+
template_code="ORDER_CONFIRM_001",
|
|
24
|
+
contacts=[{"contact": "01012345678", "var1": "ORD-001"}],
|
|
25
|
+
)
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from django.utils.functional import SimpleLazyObject
|
|
29
|
+
|
|
30
|
+
from .conf import get_client
|
|
31
|
+
|
|
32
|
+
# 설정이 없어도 임포트 자체는 실패하지 않도록, 실제 접근 시점에만
|
|
33
|
+
# get_client()를 호출하는 지연 프록시를 제공합니다.
|
|
34
|
+
client = SimpleLazyObject(get_client)
|
|
35
|
+
|
|
36
|
+
__all__ = ["get_client", "client"]
|
|
37
|
+
__version__ = "1.0.0"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import warnings
|
|
2
|
+
|
|
3
|
+
from django.apps import AppConfig
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class SendgoConfig(AppConfig):
|
|
7
|
+
"""Sendgo Django 확장 앱 설정."""
|
|
8
|
+
|
|
9
|
+
name = "sendgo_django"
|
|
10
|
+
verbose_name = "Sendgo 메시지 발송"
|
|
11
|
+
|
|
12
|
+
def ready(self) -> None:
|
|
13
|
+
"""앱 로드 시 SENDGO 설정 존재 여부를 검증합니다.
|
|
14
|
+
|
|
15
|
+
설정이 없더라도 앱 로딩을 막지 않고 경고만 출력합니다.
|
|
16
|
+
(실제 클라이언트 생성 시점에 ImproperlyConfigured가 발생합니다.)
|
|
17
|
+
"""
|
|
18
|
+
from django.conf import settings
|
|
19
|
+
|
|
20
|
+
if not getattr(settings, "SENDGO", None):
|
|
21
|
+
warnings.warn(
|
|
22
|
+
"settings.SENDGO 설정이 없습니다. "
|
|
23
|
+
"Sendgo 클라이언트를 사용하려면 SENDGO 딕셔너리를 정의하세요.",
|
|
24
|
+
stacklevel=2,
|
|
25
|
+
)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Sendgo Django 설정 로딩 및 클라이언트 생성 모듈.
|
|
2
|
+
|
|
3
|
+
`settings.SENDGO` 딕셔너리를 읽어 `Sendgo` 코어 클라이언트를 생성/메모이즈합니다.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import Optional
|
|
9
|
+
|
|
10
|
+
from django.conf import settings
|
|
11
|
+
from django.core.exceptions import ImproperlyConfigured
|
|
12
|
+
from sendgo import Sendgo
|
|
13
|
+
|
|
14
|
+
# 기본값
|
|
15
|
+
DEFAULT_API_VERSION = "v2"
|
|
16
|
+
DEFAULT_BASE_URL = "https://sendgo.io"
|
|
17
|
+
|
|
18
|
+
# 메모이즈된 클라이언트 인스턴스
|
|
19
|
+
_client: Optional[Sendgo] = None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _get_settings() -> dict:
|
|
23
|
+
"""settings.SENDGO 딕셔너리를 반환합니다. 없으면 빈 딕셔너리."""
|
|
24
|
+
return getattr(settings, "SENDGO", None) or {}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_client() -> Sendgo:
|
|
28
|
+
"""설정 기반 Sendgo 클라이언트를 생성하고 메모이즈합니다.
|
|
29
|
+
|
|
30
|
+
ACCESS_KEY 또는 SECRET_KEY가 없으면 ImproperlyConfigured 예외를 발생시킵니다.
|
|
31
|
+
"""
|
|
32
|
+
global _client
|
|
33
|
+
|
|
34
|
+
if _client is not None:
|
|
35
|
+
return _client
|
|
36
|
+
|
|
37
|
+
config = _get_settings()
|
|
38
|
+
|
|
39
|
+
access_key = config.get("ACCESS_KEY")
|
|
40
|
+
secret_key = config.get("SECRET_KEY")
|
|
41
|
+
|
|
42
|
+
if not access_key or not secret_key:
|
|
43
|
+
raise ImproperlyConfigured(
|
|
44
|
+
"Sendgo 설정이 올바르지 않습니다. "
|
|
45
|
+
"settings.SENDGO 에 ACCESS_KEY 와 SECRET_KEY 를 지정하세요."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
_client = Sendgo(
|
|
49
|
+
access_key=access_key,
|
|
50
|
+
secret_key=secret_key,
|
|
51
|
+
kakao_sender_key=config.get("KAKAO_SENDER_KEY"),
|
|
52
|
+
sms_sender_key=config.get("SMS_SENDER_KEY"),
|
|
53
|
+
api_version=config.get("API_VERSION", DEFAULT_API_VERSION),
|
|
54
|
+
base_url=config.get("BASE_URL", DEFAULT_BASE_URL),
|
|
55
|
+
)
|
|
56
|
+
return _client
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def reset() -> None:
|
|
60
|
+
"""메모이즈된 클라이언트를 초기화합니다. (주로 테스트용)"""
|
|
61
|
+
global _client
|
|
62
|
+
_client = None
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sendgo-django
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Sendgo Django 확장 — 카카오 알림톡/친구톡, SMS/LMS/MMS
|
|
5
|
+
Author-email: Sendgo <dev@sendgo.io>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://sendgo.io
|
|
8
|
+
Project-URL: Repository, https://github.com/send-go/django
|
|
9
|
+
Keywords: sendgo,django,kakao,alimtalk,sms,notification,korea
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
|
+
Classifier: Environment :: Web Environment
|
|
12
|
+
Classifier: Framework :: Django
|
|
13
|
+
Classifier: Framework :: Django :: 4.2
|
|
14
|
+
Classifier: Framework :: Django :: 5.0
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: sendgo-python>=1.0
|
|
25
|
+
Requires-Dist: Django>=4.2
|
|
26
|
+
Dynamic: license-file
|
|
27
|
+
|
|
28
|
+
# sendgo-django
|
|
29
|
+
|
|
30
|
+
> **Django에서 카카오 알림톡, 친구톡, SMS를 가장 쉽게 발송하는 공식 Django 확장 패키지**
|
|
31
|
+
|
|
32
|
+
[](https://pypi.org/project/sendgo-django/)
|
|
33
|
+
[](https://www.djangoproject.com)
|
|
34
|
+
[](https://python.org)
|
|
35
|
+
[](LICENSE)
|
|
36
|
+
|
|
37
|
+
`sendgo-django`는 [`sendgo-python`](https://github.com/send-go/python) 코어를 확장한 **Django 전용 패키지**입니다.
|
|
38
|
+
`settings.SENDGO` 설정 기반의 클라이언트 생성, 지연 로딩 프록시(`client`), AppConfig 통합을 제공합니다.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 목차
|
|
43
|
+
|
|
44
|
+
- [설치](#설치)
|
|
45
|
+
- [빠른 시작](#빠른-시작)
|
|
46
|
+
- [프록시 사용법](#프록시-사용법)
|
|
47
|
+
- [상세 사용법](#상세-사용법)
|
|
48
|
+
- [알림톡](#알림톡)
|
|
49
|
+
- [친구톡](#친구톡)
|
|
50
|
+
- [SMS / LMS / MMS](#sms--lms--mms)
|
|
51
|
+
- [서비스 클래스 패턴](#서비스-클래스-패턴)
|
|
52
|
+
- [예외 처리](#예외-처리)
|
|
53
|
+
- [설정 옵션](#설정-옵션)
|
|
54
|
+
- [자주 묻는 질문](#자주-묻는-질문-faq)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 설치
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install sendgo-django
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`sendgo-python` 코어는 의존성으로 자동 설치됩니다.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 빠른 시작
|
|
69
|
+
|
|
70
|
+
### 1단계 — `INSTALLED_APPS` 등록 (`settings.py`)
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
INSTALLED_APPS += ["sendgo_django"]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 2단계 — `SENDGO` 설정 추가 (`settings.py`)
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
import os
|
|
80
|
+
|
|
81
|
+
SENDGO = {
|
|
82
|
+
"ACCESS_KEY": os.environ["SENDGO_ACCESS_KEY"],
|
|
83
|
+
"SECRET_KEY": os.environ["SENDGO_SECRET_KEY"],
|
|
84
|
+
"KAKAO_SENDER_KEY": os.environ.get("SENDGO_KAKAO_SENDER_KEY"),
|
|
85
|
+
"SMS_SENDER_KEY": os.environ.get("SENDGO_SMS_SENDER_KEY"),
|
|
86
|
+
"API_VERSION": "v2",
|
|
87
|
+
# "BASE_URL": "https://sendgo.io", # 기본값
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 3단계 — 뷰에서 알림톡 전송
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
# views.py
|
|
95
|
+
from django.http import JsonResponse
|
|
96
|
+
from sendgo_django import client
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def confirm_order(request, order_id):
|
|
100
|
+
order = get_order(order_id)
|
|
101
|
+
|
|
102
|
+
client.alimtalk.send(
|
|
103
|
+
template_code="ORDER_CONFIRM_001",
|
|
104
|
+
contacts=[
|
|
105
|
+
{
|
|
106
|
+
"contact": order.phone,
|
|
107
|
+
"name": order.name,
|
|
108
|
+
"var1": order.number,
|
|
109
|
+
"var2": f"{order.total:,}원",
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
return JsonResponse({"success": True})
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 프록시 사용법
|
|
120
|
+
|
|
121
|
+
`sendgo_django.client`는 `SimpleLazyObject` 기반 **지연 로딩 프록시**입니다.
|
|
122
|
+
패키지를 임포트하는 시점에는 클라이언트를 생성하지 않고, 실제로 속성에 접근할 때
|
|
123
|
+
`get_client()`를 호출합니다. 따라서 설정이 없어도 임포트만으로는 오류가 나지 않습니다.
|
|
124
|
+
|
|
125
|
+
```python
|
|
126
|
+
from sendgo_django import client
|
|
127
|
+
|
|
128
|
+
# 알림톡 발송
|
|
129
|
+
client.alimtalk.send(
|
|
130
|
+
template_code="ORDER_CONFIRM_001",
|
|
131
|
+
contacts=[{"contact": "01012345678", "var1": "ORD-001"}],
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# SMS 발송
|
|
135
|
+
client.sms.send_sms(
|
|
136
|
+
content="[인증] 인증번호: 123456",
|
|
137
|
+
contacts=[{"contact": "01012345678"}],
|
|
138
|
+
)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
명시적으로 인스턴스를 얻고 싶다면 `get_client()`를 직접 호출할 수 있습니다.
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
from sendgo_django import get_client
|
|
145
|
+
|
|
146
|
+
sendgo = get_client()
|
|
147
|
+
sendgo.friendtalk.send(content="안녕하세요!", contacts=[{"contact": "01012345678"}])
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 상세 사용법
|
|
153
|
+
|
|
154
|
+
### 알림톡
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
from sendgo_django import client
|
|
158
|
+
|
|
159
|
+
# 다건 발송
|
|
160
|
+
client.alimtalk.send(
|
|
161
|
+
template_code="ORDER_CONFIRM_001",
|
|
162
|
+
contacts=[
|
|
163
|
+
{"contact": "01011111111", "name": "홍길동", "var1": "ORD-001", "var2": "29,000원"},
|
|
164
|
+
{"contact": "01022222222", "name": "김철수", "var1": "ORD-002", "var2": "15,000원"},
|
|
165
|
+
],
|
|
166
|
+
)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 친구톡
|
|
170
|
+
|
|
171
|
+
```python
|
|
172
|
+
from sendgo_django import client
|
|
173
|
+
|
|
174
|
+
# 텍스트형
|
|
175
|
+
client.friendtalk.send(
|
|
176
|
+
content="안녕하세요! 7월 한정 특가 이벤트를 확인해보세요.",
|
|
177
|
+
contacts=[{"contact": "01012345678"}],
|
|
178
|
+
)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### SMS / LMS / MMS
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
from sendgo_django import client
|
|
185
|
+
|
|
186
|
+
# SMS (90자 이하)
|
|
187
|
+
client.sms.send_sms(
|
|
188
|
+
content="[Sendgo] 인증번호: 123456 (5분 이내 입력)",
|
|
189
|
+
contacts=[{"contact": "01012345678"}],
|
|
190
|
+
)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 서비스 클래스 패턴
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
# app/services.py
|
|
199
|
+
import logging
|
|
200
|
+
|
|
201
|
+
from sendgo import SendgoError
|
|
202
|
+
from sendgo_django import client
|
|
203
|
+
|
|
204
|
+
logger = logging.getLogger(__name__)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class NotificationService:
|
|
208
|
+
"""알림 발송 로직을 캡슐화한 서비스 클래스."""
|
|
209
|
+
|
|
210
|
+
def send_order_confirm(self, phone: str, order_no: str, amount: int) -> None:
|
|
211
|
+
client.alimtalk.send(
|
|
212
|
+
template_code="ORDER_CONFIRM_001",
|
|
213
|
+
contacts=[{"contact": phone, "var1": order_no, "var2": f"{amount:,}원"}],
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
def send_verification_code(self, phone: str, code: str) -> None:
|
|
217
|
+
try:
|
|
218
|
+
client.alimtalk.send(
|
|
219
|
+
template_code="VERIFY_CODE_001",
|
|
220
|
+
contacts=[{"contact": phone, "var1": code}],
|
|
221
|
+
)
|
|
222
|
+
except SendgoError:
|
|
223
|
+
logger.exception("Sendgo 인증번호 발송 실패")
|
|
224
|
+
raise
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 예외 처리
|
|
230
|
+
|
|
231
|
+
```python
|
|
232
|
+
from sendgo import SendgoError
|
|
233
|
+
from sendgo_django import client
|
|
234
|
+
|
|
235
|
+
try:
|
|
236
|
+
client.alimtalk.send(
|
|
237
|
+
template_code="ORDER_CONFIRM_001",
|
|
238
|
+
contacts=[{"contact": "01012345678", "var1": "ORD-001"}],
|
|
239
|
+
)
|
|
240
|
+
except SendgoError as e:
|
|
241
|
+
logger.error("Sendgo 발송 실패: %s", e)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 설정 옵션
|
|
247
|
+
|
|
248
|
+
`settings.SENDGO` 딕셔너리 키:
|
|
249
|
+
|
|
250
|
+
| 키 | 필수 | 기본값 | 설명 |
|
|
251
|
+
|----|------|--------|------|
|
|
252
|
+
| `ACCESS_KEY` | ✅ | — | Sendgo 액세스 키 |
|
|
253
|
+
| `SECRET_KEY` | ✅ | — | Sendgo 시크릿 키 |
|
|
254
|
+
| `KAKAO_SENDER_KEY` | | `None` | 카카오 발신프로필 키 |
|
|
255
|
+
| `SMS_SENDER_KEY` | | `None` | SMS 발신자 키 |
|
|
256
|
+
| `API_VERSION` | | `"v2"` | API 버전 |
|
|
257
|
+
| `BASE_URL` | | `"https://sendgo.io"` | API 기본 URL |
|
|
258
|
+
|
|
259
|
+
`ACCESS_KEY` 또는 `SECRET_KEY`가 없으면 클라이언트 생성 시 `django.core.exceptions.ImproperlyConfigured`가 발생합니다.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 자주 묻는 질문 (FAQ)
|
|
264
|
+
|
|
265
|
+
**Q. `sendgo-python`과의 차이는 무엇인가요?**
|
|
266
|
+
A. `sendgo-python`은 프레임워크 독립적인 순수 Python 코어 패키지입니다. `sendgo-django`는 이를 확장해 `settings.SENDGO` 설정 바인딩, 지연 로딩 프록시, AppConfig 통합을 추가합니다.
|
|
267
|
+
|
|
268
|
+
**Q. 설정 없이 임포트하면 오류가 나나요?**
|
|
269
|
+
A. 아니요. `client`는 지연 프록시이므로 임포트만으로는 오류가 없고, 실제 사용(속성 접근) 시점에 설정을 검증합니다.
|
|
270
|
+
|
|
271
|
+
**Q. 테스트 시 클라이언트를 초기화하려면?**
|
|
272
|
+
A. `sendgo_django.conf.reset()`을 호출하면 메모이즈된 클라이언트가 초기화됩니다.
|
|
273
|
+
|
|
274
|
+
**Q. Django 4.2, 5.x를 지원하나요?**
|
|
275
|
+
A. 네, `Django>=4.2`를 지원합니다.
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## 관련 패키지
|
|
280
|
+
|
|
281
|
+
| 언어/프레임워크 | 패키지 | GitHub |
|
|
282
|
+
|----------------|--------|--------|
|
|
283
|
+
| Python (순수) | `sendgo-python` | [python](https://github.com/send-go/python) |
|
|
284
|
+
| Laravel | `sendgo/laravel` | [laravel](https://github.com/send-go/laravel) |
|
|
285
|
+
| Spring Boot | `io.sendgo:sendgo-spring` | [spring](https://github.com/send-go/spring) |
|
|
286
|
+
| Node.js | `@sendgo/node` | [node](https://github.com/send-go/node) |
|
|
287
|
+
| 전체 목록 | — | [send-go GitHub 조직](https://github.com/send-go) |
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 라이선스
|
|
292
|
+
|
|
293
|
+
MIT License © 2026 [Sendgo](https://sendgo.io)
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
*키워드: 카카오 알림톡 Django, 카카오 친구톡 Django, SMS 발송 Django, 알림톡 Django 패키지, Django 카카오 API 연동, Sendgo Django SDK*
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
sendgo_django/__init__.py
|
|
5
|
+
sendgo_django/apps.py
|
|
6
|
+
sendgo_django/conf.py
|
|
7
|
+
sendgo_django.egg-info/PKG-INFO
|
|
8
|
+
sendgo_django.egg-info/SOURCES.txt
|
|
9
|
+
sendgo_django.egg-info/dependency_links.txt
|
|
10
|
+
sendgo_django.egg-info/requires.txt
|
|
11
|
+
sendgo_django.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sendgo_django
|