• Stars
    star
    143
  • Rank 257,007 (Top 6 %)
  • Language
    Python
  • License
    MIT License
  • Created over 7 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Use Django To Create A Simple Shopping Site Tutorial

django-shop-tutorial

Django-shop-tutorial 基本教學 - 從無到有 Django-shop-tutorial 📝

大家一定常看到購物網站,今天要教大家使用 Django 建立一個簡易版購物網站 😄

建議對 Django 不熟悉的朋友,可以先觀看我之前寫的文章( 進入 Django 的世界)

特色

  • 簡易版購物網站
  • PayPal 金流

安裝套件

請在 cmd ( 命令提示字元 ) 輸入以下指令

pip install -r requirements.txt

我可以從這篇學到什麼

  • 購物網站
  • 認識 Django 的 sessions
  • 認識 Django 的 context-processors
  • PayPal Tutorial
  • 認識 Django 的 Signals
  • 認識 ngrok

教學

請先確認電腦有安裝 Python

clone 專案

git clone https://github.com/twtrubiks/django-shop-tutorial.git

執行 makemigrations 以及 migrate ,建立 DATABASE

請在 cmd ( 命令提示字元 ) 輸入以下指令

python manage.py makemigrations
python manage.py migrate

如果對上方操作不理解,可以參考我之前寫的 django-field-tutorial ,帶你認識 Django ORM and Relationship Field。

建立 admin 帳號

請在 cmd ( 命令提示字元 ) 輸入以下指令

python manage.py createsuperuser

我有將 database 傳上去,大家也可以直接使用我的 database。後台帳號密碼如下,

帳號 : twtrubiks

密碼 : password123

認識 Django 的 sessions

首先需要確定 settings.py 裡面的 MIDDLEWARE 包含 'django.contrib.sessions.middleware.SessionMiddleware' ,

一般預設 settings.py 裡面就已經設定了,所以通常不用特別另外設定。

以下介紹 session 一些基本用法,

設置 session

request.session['yo'] = 'yo'

取得 session

request.session.get('yo',None)

刪除 session

del request.session['yo']

P.S 假如 key 已經不存在了,則會噴錯 ( KeyError )

查看目前所有的 session key

request.session.keys()

基本上,sessions 的使用和 python 中的字典是類似的。

更多的資料可參考 https://docs.djangoproject.com/en/1.11/topics/http/sessions/

session 在專案中使用的地方可查看 cart.py,在裡面有用到 __iter__ 以及 __len__

如果不了解 __iter__ 是什麼 ,可以參考我之前寫的簡單範例

python-notes __iter__tutorial.py

從上面這個範例你可以了解到,基本上就是使用 for in 的時候,他會開始迭代,並且呼叫 __iter__

如果不了解 __len__ 是什麼 ,可以參考我之前寫的簡單範例

python-notes _len_tutorial.py

從上面這個範例你可以了解到,基本上就是使用 len() 方法時,會呼叫 __len__

認識 Django 的 context-processors

context-processors 可以讓你在 code 的任何地方存取他,

換個說法,在任何一個 template 中都可以存取這個變數。

可參考

https://docs.djangoproject.com/en/1.11/ref/templates/api/#built-in-template-context-processors

https://docs.djangoproject.com/en/1.11/ref/templates/api/#using-requestcontext

settings.py 裡面的 TEMPLATES 有一個名稱為 context_processors,我們在裡面加入一行

'cart.context_processors.cart'

這行是我們自己定義的路徑 context_processors.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'cart.context_processors.cart',
            ],
        },
    },
]

設定完之後,你就可以在任何的 template 中存取這個 cart 這個變數。

之前也有介紹過 自定義模版,也是可以在 template 中使用,

可以參考之前寫的 瞭解 django template tag ( 自定義模板 )

PayPal Tutorial

如果你想看 flask 版本 ,可以參考我之前寫的 PayPal_flask

首先,建立一個 PayPal 帳號 PayPal,安裝 django-paypal

pip install django-paypal

可參考文件說明

https://github.com/spookylukey/django-paypal

https://django-paypal.readthedocs.io/en/stable/standard/ipn.html

使用 PayPal Standard IPN , IPN 全名為 Instant Payment Notification,

編輯你的 settings.py 文件,並加上 'paypal.standard.ipn' 到 INSTALLED_APPS 中

INSTALLED_APPS = (
    ....
    'paypal.standard.ipn',
    ...
)

請在 settings.py 加入以下的設定

PAYPAL_RECEIVER_EMAIL = '[email protected]'
PAYPAL_TEST = True

PAYPAL_RECEIVER_EMAIL : 你的測試 PayPal 帳號,也就是 [email protected] 這組帳號,

[email protected] 這是你的測試帳號,說明可以參考文章後面的說明。

PAYPAL_TEST:告訴 PayPal 是在沙盒環境下。

更新 database

python manage.py migrate

請在 urls.py 底下增加下方的設定

url(r'^paypal/', include('paypal.standard.ipn.urls')),

django-paypal 提供兩種 IPN signals

valid_ipn_received

正確的資料,而且不是從現有資料庫中複製的訊息。

invalid_ipn_received

失敗的資料,而且這筆資料會有一個 flag。

可參考 http://django-paypal.readthedocs.io/en/stable/standard/ipn.html

PayPal 的沙盒 ( sandbox ) 教學

請先到 https://developer.paypal.com/ 登入你的帳號

先使用你註冊的帳號登入

登入後,請點 Sandbox -> Accounts 這個

裡面預設會有兩組帳號( 記得去重改這兩組測試帳號的密碼 )

修改測試帳號密碼的方式可參考下方

簡單說明一下這兩組測試帳號,

xxxxxxxx-facilitator 這組帳號是賣家

xxxxxxxx-buyer 這組帳號是買家

測試購買時,請用 xxxxxxxx-buyer 這組帳號登入,

要確認收款時, 請用 xxxxxxxx-facilitator 這組帳號登入,

以上兩組帳號可以登入下方沙盒 ( sandbox ) 測試

https://www.sandbox.paypal.com/signin

P.S

當你成功使用 xxxxxxxx-buyer 測試帳號購買後,

請記得要用 xxxxxxxx-facilitator 這組帳號登入 去確認收款。

使用 xxxxxxxx-buyer 這組帳號登入沙盒 ( sandbox ) 畫面

使用 xxxxxxxx-facilitator 這組帳號登入沙盒 ( sandbox ) 畫面

....

認識 Django 的 Signals

django 裡的 signals 你可以把他想成是一種觸發器,當某種事件被觸發時,去處理一些事情,看下面這個例子,

這個例子就是當 Request 結束時,my_callback 會被觸發。

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")

我們換個方向思考,不知道大家有沒有玩過 database 的 trigger,下圖為 MySQL trigger,

這時候你可能會想,那我們可以透過 signals 建立類似行為的功能嗎 ?

答案是可以的 ! 我們在這裡就暫時不介紹,下次我會在對 signals 做更深

入的介紹,這邊大家先知道一個概念就好 😙

開始介紹範例的 signals,

設定 signals,以該專案為例,先在 payment/apps.py 裡面增加以下程式碼

from django.apps import AppConfig


class PaymentConfig(AppConfig):
    name = 'payment'
    verbose_name = 'Payment'

    def ready(self):
        # import signal handlers
        import payment.signals

AppConfig.ready() 的說明可以參考 https://docs.djangoproject.com/en/1.11/ref/signals/#class-prepared

以下擷取官方說明

If you provide an AppConfig instance as the sender argument, please ensure that the signal is registered in ready(). AppConfigs are recreated for tests that run with a modified set of INSTALLED_APPS (such as when settings are overridden) and such signals should be connected for each new AppConfig instance.

接著再將 payment/init.py 裡面增加以下程式碼,用意主要是告訴 Django 我們設定的路徑

default_app_config = 'payment.apps.PaymentConfig'

更多詳細的說明可參考官網 https://docs.djangoproject.com/en/1.11/topics/signals/

說明

Since this signal is sent during the app registry population process, and AppConfig.ready() runs after the app registry is fully populated, receivers cannot be connected in that method. One possibility is to connect them AppConfig.init() instead, taking care not to import models or trigger calls to the app registry.

payment/signals.py

def payment_notification(sender, **kwargs):
    ipn_obj = sender
    if ipn_obj.payment_status == ST_PP_COMPLETED:

        # Check that the receiver email is the same we previously
        # set on the `business` field. (The user could tamper with
        # that fields on the payment form before it goes to PayPal)
        if ipn_obj.receiver_email != settings.PAYPAL_RECEIVER_EMAIL:
            # Not a valid payment
            return

        # payment was successful
        order = get_object_or_404(Order, id=ipn_obj.invoice)
        # mark the order as paid
        order.paid = True
        order.save()


valid_ipn_received.connect(payment_notification)

所以當 payment_notification 收到來自 PayPal 的 signals,就會去處理對應的事情。

認識 ngrok

先說明一下為什麼會需要使用到 ngrok,當我們付款成功時, PayPal 要發送一個

付款的狀態通知我們的網站,但因為我們現在是在本機測試,所以並不是一個公開

的網址 ( PayPal 無法通知我們 ),所以我們要透過 ngrok 接收 IPN 的通知,在 PayPal

的文件 https://django-paypal.readthedocs.io/en/stable/standard/ipn.html#testing

也有說明,如要測試 IPN ,必須透過 ngrok ,不能使用 localhost ( 本機 )。

請去下載 Ngrok ,免安裝版本,解壓縮即可使用,簡易的使用可以參考我之

前寫的 如何使用-ngrok,使用方法很簡單 😆

執行畫面

Django 預設後台

http://127.0.0.1:8000/admin/

alt tag

alt tag

alt tag

首頁 - 商品清單頁

http://127.0.0.1:8000/

alt tag

商品說明頁

alt tag

簡易購物車

alt tag

alt tag

確認購物明細

alt tag

輸入個人資料

alt tag

使用 PayPal 付款

alt tag

輸入測試買家帳號,

以下提供我自己的測試買家帳號

帳號 : [email protected]

密碼 : djurwo,wfeqwe3

alt tag

alt tag

alt tag

alt tag

付款後,你會發現 python console,發送了一封信,

alt tag

因為在 settings.py 中是使用 console 做測試

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

如要真的要寄出一封信,可參考 使用 Django 發送信件 ,基本上改一下設定就可以使用了。

之後再到後台觀看

alt tag

alt tag

接著我們再到 PayPal 沙盒 ( sandbox ) 中

https://www.sandbox.paypal.com/signin

使用測試 facilitator 登入,

以下提供我自己的測試買家帳號

帳號 : [email protected]

密碼 : djurwo,wfeqwe3

接受這筆付款

alt tag

當你一按接受,PayPal 就會發送一個 IPN 的通知。

請記得,這裡就是我們要用 ngrok 的原因,透過 ngrok 接收 IPN 的通知,如下圖

alt tag

alt tag

從圖中可以看到我們收到了一個新的 IPN 通知,並且狀態是 Completed

後記

相信大家有認識到不少東西,像是 Django 的 signals 以及 context-processors ,

甚至是簡單的 PayPal 付款。

寄送信件的部分,其實可以搭配 celery ,未來我會再介紹這個東西,也因為這次

介紹的東西非常多,所以可能有解釋不清楚的地方,如果你有任何問題歡迎詢問我。

執行環境

  • Python 3.6.2

Reference

Donation

文章都是我自己研究內化後原創,如果有幫助到您,也想鼓勵我的話,歡迎請我喝一杯咖啡😆

alt tag

贊助者付款

License

MIT license

More Repositories

1

docker-tutorial

Docker 基本教學 - 從無到有 Docker-Beginners-Guide 教你用 Docker 建立 Django + PostgreSQL 📝
Python
1,315
star
2

Git-Tutorials

Git-Tutorials GIT基本使用教學📝
845
star
3

django-rest-framework-tutorial

Django-REST-framework 基本教學 - 從無到有 DRF-Beginners-Guide 📝
Python
780
star
4

django-tutorial

Django 基本教學 - 從無到有 Django-Beginners-Guide 📝
Python
436
star
5

docker-django-nginx-uwsgi-postgres-tutorial

Docker + Django + Nginx + uWSGI + Postgres 基本教學 - 從無到有 ( Docker + Django + Nginx + uWSGI + Postgres Tutorial )
Python
404
star
6

line-bot-tutorial

line-bot-tutorial use python flask
Python
286
star
7

docker-swarm-tutorial

Docker Swarm 基本教學 - 從無到有 Docker-Swarm-Beginners-Guide📝
Python
185
star
8

linux-note

主要是紀錄一些 linux 的指令📝
171
star
9

docker-django-nginx-uwsgi-postgres-load-balance-tutorial

實戰 Docker + Django + Nginx + uWSGI + Postgres - Load Balance -Tutorial 📝
Python
103
star
10

odoo-demo-addons-tutorial

學習 odoo , 本文章會持續更新
Python
102
star
11

docker-elk-tutorial

docker-elk-tutorial + django + logging
Python
99
star
12

Deploying-Flask-To-Heroku

Deploying a Flask App To Heroku Tutorial
CSS
95
star
13

DRF-dataTable-Example-server-side

DataTables Example (server-side) - Python Django REST framework
HTML
92
star
14

python-notes

Python Study Notes 📝
Python
89
star
15

vscode_python_note

教大家如何建立自己的 Visual Studio Code Python 開發環境 📝
Python
86
star
16

odoo-docker-tutorial

利用 docker 快速建立 odoo 環境
Dockerfile
73
star
17

django_social_login_tutorial

Django Social Login Tutorial
Python
65
star
18

PttAutoLoginPost

PTT自動登入發文(Python)
Python
62
star
19

django-celery-tutorial

Django Celery Tutorial
Python
59
star
20

CORS-tutorial

Use Django To Introduce CORS and Same-Origin Policy
Python
53
star
21

facebook-messenger-bot-tutorial

facebook-messenger-bot-tutorial use Python Django
Python
51
star
22

CSRF-tutorial

Use Django To Introduce CSRF and Cookies , Session 📝
Python
49
star
23

django-chat-room

chat-room 💬 use django-channels3
Python
49
star
24

docker-django-celery-tutorial

docker-django-celery-tutorial 基本教學 📝
Python
45
star
25

django-docker-redis-tutorial

django-docker-redis-tutorial 📝
Python
41
star
26

Flask-Login-example

Login register facebook Login - Python Flask
Python
40
star
27

django-transactions-tutorial

django-transactions-tutorial 基本教學 - 了解 transactions 概念 📝
Python
39
star
28

odoo-development-environment-tutorial

建立 odoo 開發環境 ( source code )
36
star
29

auto_crawler_ptt_beauty_image

Auto Crawler Ptt Beauty Image Use Python Schedule
Python
36
star
30

line-bot-imgur-tutorial

透過 imgur api 製作簡單 line bot
Python
36
star
31

django-channels2-tutorial

django-channels2 tutorial 💬
Python
33
star
32

Gulp-Beginners-Guide

Gulp 基本教學 - 從無到有 Gulp-Beginners-Guide
JavaScript
31
star
33

fluent-python-notes

Fluent Python Study Notes 📝
Python
27
star
34

nginx-rtmp-tutorial

Docker Nginx 搭配 RTMP HLS 建立簡易直播 Server
XSLT
26
star
35

docker-letsencrypt-django-nginx-proxy-uwsgi-postgres

Docker + Letsencrypt + Django + Nginx-Proxy + uWSGI 教學
Python
26
star
36

Flask-Babel-example

How Use Flask-Babel on Windows - Python Flask
Python
25
star
37

leetcode-python

LeetCode use Python 📝
Python
24
star
38

chat-room

Chat-Room Use Python Socket.IO
CSS
24
star
39

Deploying_Django_To_Heroku_With_Docker

How Deploying Django To Heroku With Docker ( tutorial )
Python
23
star
40

Deploying_Django_To_Heroku_Tutorial

Deploying a Django App To Heroku Tutorial
Python
22
star
41

django-field-tutorial

Django ORM and Relationship Field OneToOneField , ForeignKey ,ManyToManyField 📝
Python
22
star
42

leaflet-tutorials-interesting

leaflet tutorials interesting use Python Flask
JavaScript
22
star
43

django_rest_framework_swagger_tutorial

django rest framework swagger tutorial
Python
22
star
44

python-pdfkit-example

python-pdfkit HTML TO PDF Example
C
19
star
45

vscode_django_note

如何使用 VScode 執行 Django 📝
Python
19
star
46

mybot

使用Hubot建立屬於自己的機器人 (Build Your Own Robot With Hubot)
CoffeeScript
18
star
47

PttImageSpider

PTT 圖片下載器 (抓取整個看板的圖片,並用文章標題作為資料夾的名稱 ) (使用Scrapy)
Python
18
star
48

youtube-trends-spider

crawler youtube trends use selenium on python
Python
18
star
49

ptt_beauty_infinite_scroll

結合 Django + jQuery 實現無限捲軸 Infinite Scroll 📝
CSS
17
star
50

PttAutoPush

PTT自動推文 推文機器人(Python)
Python
15
star
51

crawler_click_tutorial

click tutorial ( crawler ) use python
Python
15
star
52

google_play_store_spider

抓取 google play store 資料 use Scrapy on python
Python
15
star
53

django-translation-tutorial

How to use Django to implement translations 📝
Python
14
star
54

eynyCrawlerMega

eyny 電影 Mega and Google 連結爬蟲 use python
Python
14
star
55

python-creation-of-virtual-environments

如何使用 venv 建立 virtual environments 📝
14
star
56

docker-remote-interpreter

Using Docker as a Remote Interpreter ( Pycharm )
Python
13
star
57

Flask-Mail-example

Flask-Mail - 使用 Python Flask 完成寄信功能
Python
11
star
58

django_middleware_tutorial

介紹 django 中的 middleware
Python
11
star
59

Google-Play-Store-spider-bs4-excel

Google-Play-Store-spider use Beautiful Soup on Python to EXCEL
Python
10
star
60

flask-dropzone-wavesurfer

python flask-dropzone-wavesurfer 使用Python Flask 搭配 Dropzone.js 和 WaveSurfer.js
CSS
10
star
61

github-actions-tutorial

Python
10
star
62

twtrubiks

9
star
63

line-bot-oop

line-bot refactor use oop (design pattern)
Python
9
star
64

django_recaptcha_tutorial

django recaptcha tutorial
Python
8
star
65

Google-Play-Store-spider-selenium

Google-Play-Store-spider use Selenium +Beautiful Soup on Python
Python
8
star
66

PttStatistics

統計PTT看板推文 or 文章標題 熱門關鍵詞 on python
Python
8
star
67

PayPal_flask

PayPal example use Python Flask
JavaScript
7
star
68

movie-crawler

簡易爬蟲 抓取 開眼電影網 近期上映電影 使用Node.js
JavaScript
7
star
69

Thank-you-for-donate

感謝您對 https://github.com/twtrubiks 以及 youtube 教學頻道 的支持 👍
6
star
70

postgresql-note

主要是紀錄一些 postgresql 的指令
Python
6
star
71

dowload-Image-PTT

PTT圖片下載器 (C# WinForm) For Windows
C#
6
star
72

face-recognition-notes

紀錄 face-recognition 學習
6
star
73

PttCrawlerContent

PTT Crawler Content on python PTT文章爬蟲
Python
5
star
74

docker-selenium-tutorial

docker-selenium-tutorial use pyhton
Python
5
star
75

Flask-Migrate-Tutorial

透過 Flask-Migrate-Tutorial 管理資料庫 (database)
Python
5
star
76

mood-note

5
star
77

k8s-tutorial

Kubernetes tutorial
5
star
78

pillow-examples

some pillow examples use python
Python
4
star
79

python-EXIF-Orientation

Automatically determine whether the photo has been rotated, if it is rotated, the photo is turned right
Python
4
star
80

Croppic-combine-Carousel-Example

Croppic 搭配 Carousel 簡單範例 ,使用 Python Flask
JavaScript
3
star
81

aglio_tutorial

aglio tutorial
HTML
3
star
82

Bower-Beginners-Guide

Bower 基本教學 - 從無到有 Bower-Beginners-Guide
3
star
83

Deploying-Flask-To-OpenShift

Deploying a Flask App To OpenShift Tutorial 📝
3
star
84

docker-pgadmin4-tutorial

利用 docker 快速建立 pgadmin4、Linux install pgadmin4
2
star
85

Stripe_flask

Stripe Use Python Flask
JavaScript
2
star
86

Install_Ubuntu_on_HyperV_tutorial

Windows 透過 Hyper-V 安裝 Ubuntu 18.04
2
star
87

django_N_add_1_queries_problem_tutorial

Django N+1 Queries Problem
Python
1
star
88

Sort-String-To-SQL

Sort String To SQL For Python 📝
Python
1
star
89

AKBGroup_SongList_Flask

AKBGroup_SongList_Flask ( AKB48Group點歌單 )
HTML
1
star
90

Power-Auto-Shutdown

Computer Power-Auto-Shutdown ( 電腦自動排程軟體 ) C# WinForms applications
C#
1
star
91

summernote_Nestable_flask

summernote Combine Nestable Python Flask
JavaScript
1
star
92

AKBGroup_SongList

AKBGroup_SongList ( AKB48Group點歌單 )
HTML
1
star