用 Django 做了一個照片分享網站


最近翻了一下過去做過的東西,找到了這個綠光照片分享,於是就拿來分享了。項目地址在:

https://github.com/restran/green-glow

這是我2012年的一個課程作業,實現的功能是照片分享。正好以這個作業學習了 Django 和 Web 開發。當時特別喜歡豆瓣、又拍和 Flickr,所以幾乎是模仿這幾個網站的方式,完成了整個網站。

當時還有許多未完成的功能:

  1. 注冊郵件驗證,找回密碼;
  2. 驗證碼;
  3. ...

環境及依賴

這個網站使用 python 2.7 開發,其他版本沒有測試過。django 使用最新版的話會出錯,所以需要指定版本。推薦使用 virtualenv 來搭建環境。

django==1.2.7
pillow
qiniu==6.1.4

配置

如果部署網站,需要做如下配置

# 圖片存儲在七牛上,需要配置七牛的帳號
qiniu.conf.ACCESS_KEY = "123"
qiniu.conf.SECRET_KEY = "456"

# 存在七牛上的圖片的文件名前綴
QINIU_FILE_PREFIX = 'grnglow'
# 七牛圖片存儲的 URL
QINIU_IMG_URL = 'http://your-domain.qiniudn.com/'
# 主頁的URL
HOME_PAGE_URL = 'http://127.0.0.1:8000/'

數據庫默認使用 SQLite,可以修改成 MySQL

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(PROJECT_PATH, 'db.sqlite3'),
    }
}

在運行網站前,需要先建表,可以執行

python manage.py syncdb

熱門圖片排序

其中計算照片的精彩程度是通過喜歡來進行投票的。為了不使一張照片長期占據排名的前面部分,在計算照片的得分時考慮了現在的時間與照片上傳時間的差值,使得后上傳的照片可以有機會排到前面。

當時看了幾篇基於用戶投票的排序算法:

  1. 基於用戶投票的排名算法(一):Delicious和Hacker News
  2. 基於用戶投票的排名算法(二):Reddit
  3. 基於用戶投票的排名算法(三):Stack Overflow
  4. 基於用戶投票的排名算法(四):牛頓冷卻定律
  5. 基於用戶投票的排名算法(五):威爾遜區間
  6. 基於用戶投票的排名算法(六):貝葉斯平均

為了簡單起見,不用后台一個程序計算排名。參照這些算法簡化了一下,計算公式如下:

score_equation.png

其中k1和k2是系數,T是當前時間據某個系統設置的初始時間的差。由於得分采用的是發生喜歡操作時,計算一次得分。因此,為每個得分都加上一個隨時間增長的分數增量,使得后上傳的照片獲得更高的分數。g是照片得分的下降指數,大於1,可以使得新上傳的照片下降的速度慢一點,老照片會下降的快一點。由於arctan(0)等於0,因此加上系數0.5,避免除以0。由於用戶上傳照片時喜歡數為0,因此加上1,表示用戶為自己的照片投票。

def calculateScore(self):
    begin_time = datetime.datetime(2012, 1, 1, 0, 0, 0)
    time_offset1 = datetime.datetime.now() - begin_time
    time_offset2 = datetime.datetime.now() - self.date_posted
    minutes1 = (time_offset1.days * 24 * 60) + time_offset1.seconds / 60
    minutes2 = (time_offset2.days * 24 * 60) + time_offset2.seconds / 60
    self.score = minutes1 / 120.0 + (self.like_count + 1) / (math.atan(minutes2 / 240.0 + 0.5) ** 2.2)

網站效果圖

首頁

img1.jpg


個人主頁

img2.jpg


探索頁面

img3.jpg


照片詳細頁面

img4.jpg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM