4-用戶個人信息和二次開發django的文件存儲系統


用戶的個人信息的前端頁面如下:

業務邏輯分析

從上圖中可以看出,需要后端傳送的數據有,用戶的名字和練習的地址,和最近的瀏覽記錄。

用戶的名字和聯系的地址可以通過地址表(adress)中獲得,地址表可以通過,request.user.address_set獲得。

而瀏覽的記錄存在redis中,是因為下次用戶退出登陸的時候,瀏覽的歷史記錄還在,

瀏覽歷史記錄 增加 是頻繁的 只要訪問商品詳情頁,就要記錄信息。儲存在redis中可以用兩種類型:(我們這里用的就是列表

哈希:把所有人的數據放在一條記錄里   ‘history’:{'user_1':' ',  'user_2':' '  ,'user_3':' '}

列表:每個人的記錄單獨記錄一條    'history_1':[1,2,3,4,5]

 查看歷史記錄,相對訪問次數較少只要記錄商品的id  (sku_id) 就可以   ,保存到內存型數據庫里

 不放到session數據中,直接操作redis,自己維護數據,是用戶下次登錄仍然可以看到歷史信息

用戶id為1的 記錄 舉例  在redis 中存儲的  格式   “history_1”: [1,2,3,4,5].,

取的時候返回的是一個列表.在通過Goodsku表對列表進行取出對應的商品

1  編寫個人信息的視圖請求的處理函數class UserInfoView:

from django_redis import get_redis_connection
from django_redis import get_redis_connection

class UserInfoView(LoginRequiredMixin, View):
    """用戶信息頁面"""
    def get(self, request):
        # 獲取用戶的地址信息
        user = request.user
        # 獲取用戶的地址信息,按照創建時間選擇最新的一條
        try:
            address = user.address_set.latest("create_time")
        except Address.DoesNotExist:
            address = None

        # 獲取用戶的瀏覽歷史記錄
        # 拿到一個redis連接對象
        redis_conn = get_redis_connection("default")
        # 存在redis中的歷史數據是列表類型
        # conn.lrange(“history_1”, 0, 4)
        sku_ids = redis_conn.lrange("history_%s" % user.id, 0, 4)

        # 從數據庫中,按照sku id查詢商品的信息

        # 一次性查出所有數據,順序變了,所以不采納
        # select * from tbl where id in ()
        # skus = GoodsSKU.objects.filter(id__in=sku_ids)

        skus = []
        for sku_id in sku_ids:
            sku = GoodsSKU.objects.get(id=sku_id)
            skus.append(sku)

        context = {
            # "user": user,  # 這個數據可以不用傳,在的django中可以直接使用
            "skus": skus,
            "address": address,
        }

        return render(request, "user_center_info.html", context)

關於Django查詢方法的文檔:http://python.usyiyi.cn/documents/django_182/ref/models/querysets.html

2 寫出個人信息對應的url路徑:

url(r'^info$', views.UserInfoView.as_view(), name="info"),

3 前端返回瀏覽歷史的代碼如下:

<ul class="goods_type_list clearfix">
    {% for sku in skus %}
	<li>
		<a href="detail.html"><img src="{{ sku.default_image.url }}"></a>
		<h4><a href="detail.html">{{ sku.name }}</a></h4>
		<div class="operate">
			<span class="prize">¥{{ sku.price }}</span>
			<span class="unit">{{ sku.price }}/{{ sku.unit }}</span>
			<a href="#" class="add_goods" title="加入購物車"></a>
		</div>
	</li>
     {% endfor %}
</ul>

==========================================================

說明:

以下的代碼是對上面的用戶信息進行解釋和說明的

下面的代碼獲取的是用戶的最新地址的信息。

try:
address = user.address_set.latest("create_time")
except Address.DoesNotExist:
address = None

下面的這段代碼是取出存放在redis中用戶瀏覽的歷史數據存放的類型是哈希  ‘鍵’:[1,2,3,4,5].,通過lrange('鍵',0,4)返回的是包含5條信息的列表.

在通過便利這個列表,讓商品表GoodSKU取出每條商品對應的對象.就可以交給前端展示了.

redis常用的命令: http://redisdoc.com/index.html

python操作redis數據庫:http://redis-py.readthedocs.io/en/latest/#indices-and-tables

redis_conn = get_redis_connection("default")
        # 存在redis中的歷史數據是哈希類型
        # conn.lrange(“history_1”, 0, 4)
        sku_ids = redis_conn.lrange("history_%s" % user.id, 0, constants.USER_HISTORY_NUM-1)

        # 從數據庫中,按照sku id查詢商品的信息

        # 一次性查出所有數據,順序變了,所以不采納
        # select * from tbl where id in ()
        # skus = GoodsSKU.objects.filter(id__in=sku_ids)

        skus = []
        for sku_id in sku_ids:
            sku = GoodsSKU.objects.get(id=sku_id)
            skus.append(sku)

 

 ============================================================================================

1.1Django二次開發對接FastDFS

FastDFS(分布式服務器)的兩個特點:

1 動態擴容

2 文件內容一樣,名字不一樣,也只會保存一份代碼(因為上傳的時候,會內容hash一下,獲取唯一身份標示)

分布式服務器的結構:

 tracker 管理群:把client的要上傳的圖片引用到一個storage的服務器上

 storage 存儲群:存儲圖片的地方

 client  客戶端:這里相當於django的項目

 

把圖片上傳到FastDFS的流程

 

 

 

 

 

引入python使用fastDFS的基本操作

from fdfs_client.client import Fdfs_client
client = Fdfs_client('/etc/fdfs/client.conf')
ret = client.upload_by_filename('test')
ret
{'Group name':'group1','Status':'Upload successed.', 'Remote file_id':'group1/M00/00/00/
	wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test'
	, 'Storage IP':'192.168.243.133'}

在django中實現自定義存儲系統需要遵循以下步驟:

1 你的自定義儲存類必須是django.core.files.storage.Storage的子類:

from django.core.files.storage import Storage

class MyStorage(Storage):
   pass

Django必須能夠不帶任何參數來實例化你的儲存類。這意味着任何設置都應該從django.conf.settings中獲取

3 你的儲存類必須實現 _open() 和 _save()方法,以及任何適合於你的儲存類的其它方法。更多這類方法請見下文。

_open(name,  mode='rb')
pass

Storage.open()調用,這是儲存類用於打開文件的實際工具。它必須返回File對象,在大多數情況下,你會想要返回一些子類,它們實現了后端儲存系統特定的邏輯。

_save(name,  content)

Storage.save()調用。name必須事先通過get_valid_name() 和 get_available_name()過濾,並且content自己必須是一個File對象。

詳細請參考:http://python.usyiyi.cn/translate/django_182/ref/files/storage.html

      http://python.usyiyi.cn/translate/django_182/howto/custom-file-storage.html

在django圖片的上傳到fastDFS的實現過程

1 創建utils/fastdfs 目錄

 

 

在fdfs_storage.py 中編寫如下的代碼:

View Code

 

2  在配置文件setting中指明修改django的默認文件存儲方式

# 修改django的默認文件存儲方式
DEFAULT_FILE_STORAGE = 'utils.fastdfs.storage.FastDFSStorage'

 fdfs_storage.py中用到的常量放到配置文件中,

# fastdfs服務器的ip地址
FASTDFS_URL = "http://10.211.55.5:8888/"
FASTDFS_CLIENT_CONF = os.path.join(BASE_DIR, "utils/fastdfs/client.conf")

  

測試fastdfs服務器

啟動tracker、storage、nginx服務:

sudo service fdfs_trackerd start

sudo service fdfs_storaged start

sudo /usr/local/nginx/sbin/nginx

 創建admin站點:

python manage.py createsuperuser   

在網址上輸入:http://127.0.0.1:8000/admin

 

 通過admin站點(商品類別 GoodsCategory)上傳一張圖圖片到一張表中,在python shell 中導入這張表,獲取表中的,img字段

在python manage.py shell中這行以下代碼:

from goods.models import GoodsCategory
c = GoodsCategory.objects.get(id=1)
c.image.url
'http://192.168.228.135:8888/group1/M00/00/00/CtM3BVnkILGACHh0AAAmv27pX4k2790330'

 在static下面創建一個test.html里面放一個圖片的標簽路徑是上面查詢的路徑:

<img src='http://192.168.228.135:8888/group1/M00/00/00/CtM3BVnkILGACHh0AAAmv27pX4k2790330'>

  在瀏覽器中輸入:

http://127.0.0.1:8000/static/test.html

 

富文本編輯器

借助富文本編輯器,網站的編輯人員能夠像使用offfice一樣編寫出漂亮的、所見即所得的頁面。此處以tinymce為例,其它富文本編輯器的使用也是類似的。

在虛擬環境中安裝包

pip install django-tinymce==2.6.0

安裝完成后,可以使用在Admin管理中,也可以自定義表單使用。

在setting中配置相應的信息

1. 在settings.py中為INSTALLED_APPS添加編輯器應用

'tinymce',  # 富文本編輯器

  

 2在settings.py中添加編輯器配置

# tinymcy配置信息
TINYMCE_DEFAULT_CONFIG = {
    'theme': 'advanced',
    'width': 600,
    'height': 400,
}

  

 

 3 在根級的/urls.py中配置編輯器url

import tinymce.urls

urlpatterns = [
    
    url(r'^tinymce/', include('tinymce.urls')),
]

  

運行服務器,進入admin后台管理,點擊GoodsInfo的添加,效果如下圖

 

 


免責聲明!

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



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