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.
@@ -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
+ [![PyPI](https://img.shields.io/pypi/v/sendgo-django)](https://pypi.org/project/sendgo-django/)
33
+ [![Django](https://img.shields.io/badge/Django-4.2%2B-092E20?logo=django)](https://www.djangoproject.com)
34
+ [![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?logo=python)](https://python.org)
35
+ [![License](https://img.shields.io/badge/license-MIT-blue)](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
+ [![PyPI](https://img.shields.io/pypi/v/sendgo-django)](https://pypi.org/project/sendgo-django/)
6
+ [![Django](https://img.shields.io/badge/Django-4.2%2B-092E20?logo=django)](https://www.djangoproject.com)
7
+ [![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?logo=python)](https://python.org)
8
+ [![License](https://img.shields.io/badge/license-MIT-blue)](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
+ [![PyPI](https://img.shields.io/pypi/v/sendgo-django)](https://pypi.org/project/sendgo-django/)
33
+ [![Django](https://img.shields.io/badge/Django-4.2%2B-092E20?logo=django)](https://www.djangoproject.com)
34
+ [![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?logo=python)](https://python.org)
35
+ [![License](https://img.shields.io/badge/license-MIT-blue)](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,2 @@
1
+ sendgo-python>=1.0
2
+ Django>=4.2
@@ -0,0 +1 @@
1
+ sendgo_django
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+