Django項目之Web端電商網站的實戰開發(三)

說明:該篇博客是博主一字一碼編寫的,實屬不易,請尊重原創,謝謝你們!php

接着上一篇博客繼續往下寫 :https://blog.csdn.net/qq_41782425/article/details/88810060css

目錄html

一丶模板文件繼承前端

二丶用戶中心頁面顯示python

三丶登陸驗證以及登陸後跳轉的地址nginx

四丶封裝login_required方法redis

五丶登陸後顯示用戶名以及退出登陸sql

六丶用戶中心-地址數據庫

七丶用戶中心-信息django

八丶分佈式文件系統FastDFS

九丶Nginx配置FastDFS使用的安裝和配置

十丶Python與FastDFS進行交互


一丶模板文件繼承

1.分析網頁中共有的模塊,定義父模板

  • step1 在templates目錄下常見base.html文件,用於主頁(index.html),登陸頁(login.html)以及註冊頁(register.html)模板的繼承
{# 首頁 註冊 登陸 #}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
{% load staticfiles %}
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    {# 網頁標題內容塊 #}
	<title>{% block title %}{% endblock title %}</title>
	<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
	<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
	{# 網頁頂部引入文件塊 #}
    {% block topfiles %}{% endblock topfiles %}
</head>
<body>
{# 網頁頂部歡迎信息塊 #}
{% block header_con %}
	<div class="header_con">
		<div class="header">
			<div class="welcome fl">歡迎來到每天生鮮!</div>
			<div class="fr">
				<div class="login_info fl">
					歡迎您:<em>張 山</em>
				</div>
				<div class="login_btn fl">
					<a href="login.html">登陸</a>
					<span>|</span>
					<a href="register.html">註冊</a>
				</div>
				<div class="user_link fl">
					<span>|</span>
					<a href="../static/user_center_info.html">用戶中心</a>
					<span>|</span>
					<a href="../static/cart.html">個人購物車</a>
					<span>|</span>
					<a href="../static/user_center_order.html">個人訂單</a>
				</div>
			</div>
		</div>
	</div>
{% endblock header_con %}

{# 網頁頂部搜索框塊 #}
{% block search_bar %}
	<div class="search_bar clearfix">
		<a href="index.html" class="logo fl"><img src="{% static 'images/logo.png' %}"></a>
		<div class="search_con fl">
			<input type="text" class="input_text fl" name="" placeholder="搜索商品">
			<input type="button" class="input_btn fr" name="" value="搜索">
		</div>
		<div class="guest_cart fr">
			<a href="#" class="cart_name fl">個人購物車</a>
			<div class="goods_count fl" id="show_count">1</div>
		</div>
	</div>
{% endblock search_bar %}

{# 網站主體內容塊 #}
{% block body %}{% endblock body %}

	<div class="footer">
		<div class="foot_link">
			<a href="#">關於咱們</a>
			<span>|</span>
			<a href="#">聯繫咱們</a>
			<span>|</span>
			<a href="#">招聘人才</a>
			<span>|</span>
			<a href="#">友情連接</a>
		</div>
		<p>CopyRight © 2016 北京每天生鮮信息技術有限公司 All Rights Reserved</p>
		<p>電話:010-****888    京ICP備*******8號</p>
	</div>
    {# 網頁底部html元素塊 #}
    {% block bottom %}{% endblock bottom %}
    {# 網頁底部引入文件塊 #}
	{% block bottomfiles %}{% endblock bottomfiles %}
</body>
</html>
  • step2 在templates目錄下常見base_detail_list.html文件,這個模板文件繼承需base.html,用於詳情頁(detail.html),列表頁(list.html)模板的繼承
{# 詳情頁 列表頁 #}
{% extends 'base.html' %}
{# 網站主體內容塊 #}
{% block body %}
	<div class="navbar_con">
		<div class="navbar clearfix">
			<div class="subnav_con fl">
				<h1>所有商品分類</h1>
				<span></span>
				<ul class="subnav">
					<li><a href="#" class="fruit">新鮮水果</a></li>
					<li><a href="#" class="seafood">海鮮水產</a></li>
					<li><a href="#" class="meet">豬牛羊肉</a></li>
					<li><a href="#" class="egg">禽類蛋品</a></li>
					<li><a href="#" class="vegetables">新鮮蔬菜</a></li>
					<li><a href="#" class="ice">速凍食品</a></li>
				</ul>
			</div>
			<ul class="navlist fl">
				<li><a href="">首頁</a></li>
				<li class="interval">|</li>
				<li><a href="">手機生鮮</a></li>
				<li class="interval">|</li>
				<li><a href="">抽獎</a></li>
			</ul>
		</div>
	</div>
    {# 詳情頁,列表頁主體內容塊 #}
    {% block main_content %}{% endblock main_content %}
{% endblock body %}
  • step3 在templates目錄下常見base_no_cart.html文件,這個模板文件繼承需base.html,用於購物車頁(cart.html),提交訂單頁(place_order.html)模板的繼承
{# 購物車 提交訂單 #}
{% extends 'base.html' %}
{% load staticfiles %}
{# 網頁頂部搜索框塊 #}
{% block search_bar %}
	<div class="search_bar clearfix">
		<a href="index.html" class="logo fl"><img src="{% static 'images/logo.png' %}"></a>
		<div class="sub_page_name fl">|&nbsp;&nbsp;&nbsp;&nbsp;{% block page_title %}{% endblock page_title %}</div>
		<div class="search_con fr">
			<input type="text" class="input_text fl" name="" placeholder="搜索商品">
			<input type="button" class="input_btn fr" name="" value="搜索">
		</div>
	</div>
{% endblock search_bar %}
  • step4 在templates目錄下常見base_user_center.html文件,這個模板文件繼承需base_no_cart.html,用於用戶中心三個頁面(user_center_info.html)(user_center_order.html)(user_center_site.html)模板的繼承
{# 用戶中心3頁面 #}
{% extends 'base_no_cart.html' %}
{% block title %}每天生鮮-用戶中心{% endblock title %}
{% block page_title %}用戶中心{% endblock page_title %}
{% block body %}
    <div class="main_con clearfix">
		<div class="left_menu_con clearfix">
			<h3>用戶中心</h3>
			<ul>
				<li><a href="user_center_info.html" class="active">· 我的信息</a></li>
				<li><a href="user_center_order.html">· 所有訂單</a></li>
				<li><a href="user_center_site.html">· 收貨地址</a></li>
			</ul>
		</div>
        {# 用戶中心右側內容塊 #}
        {% block right_content %}{% endblock right_content %}
    </div>
{% endblock body %}

 2.註冊頁登陸頁主頁繼承於父模板

  • step1 編寫註冊頁面(register.html)繼承於base.html

  • step2 編寫登陸頁面(login.html)繼承於base.html 

  •  step3 編寫主頁(index.html)繼承於bases.html

  • step4 測試頁面顯示是否正確

3.用戶中心三個頁面繼承於父模板

  •  step1 編寫(user_center_info.html)繼承於base_user_center.html

  • step2  編寫(user_center_order.html)繼承於base_user_center.html

  • step3  編寫(user_center_site.html)繼承於base_user_center.html

4.購物車頁提交訂單頁繼承於父模板

  • step1 編寫購物車頁(cart.html)繼承於base_no_cart.html

  • step2 編寫提交訂單頁(place_order.html) 繼承於base_no_cart.html

5.商品詳情頁商品列表頁繼承於父模板

  • step1  編寫詳情頁(detail.html)繼承於base_detail_list.html

  • step2  編寫列表頁(list.html)繼承於base_detail_list.html

二丶用戶中心頁面顯示

1.定義類視圖

  • step1 定義UserInfoView類並定義get方法,用於顯示用戶信息頁面
# /user
class UserInfoView(View):
    """用戶中心-信息"""
    def get(self, request):
        """顯示頁面"""
        return render(request, "user_center_info.html")
  • step2 定義UserOrderView類並定義get方法,用於顯示用戶訂單頁面
class UserOrderView(View):
    """用戶中心-訂單"""
    def get(self, request):
        """顯示頁面"""
        return render(request, "user_center_order.html")
  • step3 定義UserAddressView類並定義get方法,用於顯示用戶地址頁面
# /user/address
class UserAddressView(View):
    """用戶中心-地址"""
    def get(self, request):
        """顯示頁面"""
        return render(request, "user_center_site.html")

2.在df_user/urls中配置路由

url(r"^$", UserInfoView.as_view(), name="user"),  # 用戶中心-信息
url(r"^order$", UserOrderView.as_view(), name="order"),  # 用戶中心-訂單
url(r"^address$", UserAddressView.as_view(), name="address"), # 用戶中心-地址

3.輸入路由地址進行頁面顯示

  • step1 用戶信息頁面

  • step2 用戶訂單頁面

  • step3 用戶地址頁面

4.修改用戶中心連接地址以及激活active選擇器

  • step1 在用戶中心頁面點擊我的信息,所有訂單以及收貨地址時,跳轉到正確連接地址

 

  • step2 在base_user_center.html父模板中使用反向解析定義連接地址
<li><a href="{% url 'user:user' %}" class="active">· 我的信息</a></li>
<li><a href="{% url 'user:order' %}">· 所有訂單</a></li>
<li><a href="{% url 'user:address' %}">· 收貨地址</a></li>
  •  step3 在用戶中心三個類視圖中在返回模板文件時,傳遞三個頁面不一樣的參數,根據參數來判斷active激活哪一個頁面
return render(request, "user_center_info.html", {"page":"user"})
return render(request, "user_center_info.html", {"page":"order"})
return render(request, "user_center_info.html", {"page":"address"})
  • step4 緊接着在base_user_center.html父模板對後端返回的數據進行判斷處理
<ul>
	<li><a href="{% url 'user:user' %}" {% if page == 'user' %}class="active"{% endif %}>· 我的信息</a></li>
	<li><a href="{% url 'user:order' %}"{% if page == 'order' %}class="active"{% endif %}>· 所有訂單</a></li>
	<li><a href="{% url 'user:address' %}"{% if page == 'address' %}class="active"{% endif %}>· 收貨地址</a></li>
</ul>
  • step5 測試效果

三丶登陸驗證以及登陸後跳轉的地址

1.登陸驗證

  • step1 導入django模塊中的login_required方法,驗證用戶是不是登陸狀態,也就是獲取session的值,若是用戶是登陸狀態,那麼則能夠訪問須要登陸成功後所訪問的頁面,若是用戶未登陸,直接訪問須要登陸後才能看到的頁面,則login_required方法默認跳轉到http://127.0.0.1:8000/accounts/login/?next=/user/頁面
from django.contrib.auth.decorators import login_required
  • step2 在df_user/urls中對用戶中心信息頁添加login_required登陸驗證方法
url(r"^$", login_required(UserInfoView.as_view()), name="user"),  # 用戶中心-信息

說明:這裏之因此換了個瀏覽器是由於以前的谷歌瀏覽器有登陸成功保存的session,博主不想清除瀏覽緩存

  •  step4 在官網文檔中調用login_required方法,設置驗證不成功跳轉的地址,則須要在項目settings配置文件中配置LOGIN_URL,設置爲登陸地址

2.登陸成功後跳轉的地址

  • step1 根據login_required方法驗證未登陸狀態跳轉的登陸地址http://127.0.0.1:8000/user/login?next=/user/,在LoginView類視圖post方法中,獲取請求地址next參數的值,若是當用戶訪問的是http://127.0.0.1:8000/user/login登陸頁面,則next請求地址參數中的next參數沒法獲取,因此設置默認值爲反向解析主頁地址
next_url = request.GET.get("next", reverse("goods:index"))
response = redirect(next_url)

url(r"^order$", login_required(UserOrderView.as_view()), name="order"),  # 用戶中心-訂單
url(r"^address$", login_required(UserAddressView.as_view()), name="address"), # 用戶中心-地址

四丶封裝login_required方法

1.定義工具類

  • step1 在項目目錄下建立utils包,在utils包下建立mixin.py文件

  • step2 在mixin.py文件中建立LoginRequiredMixin類,封裝login_required方法
from django.contrib.auth.decorators import login_required  # 驗證是否登陸

class LoginRequiredMixin(object):
    @classmethod
    def as_view(cls, **initkwargs):
        view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
        return login_required(view)

2.在用戶中心類視圖中繼承LoginRequiredMixin類並在urls中去掉login_required方法

  • step1 繼承LoginRequiredMixin類

  • step2 去掉login_required方法
url(r"^$", UserInfoView.as_view(), name="user"),  # 用戶中心-信息
url(r"^order$", UserOrderView.as_view(), name="order"),  # 用戶中心-訂單
url(r"^address$", UserAddressView.as_view(), name="address"),  # 用戶中心-地址
  • step3 驗證成功

五丶登陸後顯示用戶名以及退出登陸

1.登陸後顯示用戶名不顯示登陸註冊功能選項

  • step1 Django框架默認會給前端模板文件傳遞request.user對象,若是用戶是登陸狀態訪問頁面會返回User類的對象user,若是未登陸則返回AnonymousUser實力對象,當給前端模板文件返回的是user對象(已登陸)則這個實力對象去調is_authenticated方法則會返回True,(未登陸)AnonymousUser實力對象去調用is_authenticated方法則會返回False,在base.html模板文件中根據user對象進行判斷,若是沒有使用重複模板的繼承複用,則須要在有class=‘header_con’模塊的模板文件中一一進行判斷,在此體現出重複內容模板繼承的重要性
{% if user.is_authenticated %}
<div class="login_btn fl">
	歡迎您:<em style="color: #f89752">{{ user.username }}</em>
</div>
{% else %}
<div class="login_btn fl">
	<a href="/user/login">登陸</a>
	<span>|</span>
	<a href="/user/register">註冊</a>
</div>
 {% endif %}
  • step2 直接刷新已登陸後的主頁進行驗證

2.退出登陸

  • step1 在base.html模板文件中添加退出按鈕
<div class="login_btn fl">
	<span>|</span>
	<a href="{% url 'user:logout' %}">退出</a>
</div>
  •  step2 在views中定義Logout類視圖完成退出功能
# /user/logout
class LogoutView(View):
    """退出"""
    def get(self, request):
        logout(request)
        # 退出後跳轉到主頁
        return redirect(reverse("goods:index"))
  • step3 在urls中定義退出路由
url(r"^logout$", LogoutView.as_view(), name="logout"),  # 註銷

3.驗證登陸登出功能

六丶用戶中心-地址

 1.在UserAddressView類中定義post方法添加地址

  • step1 接收用戶填寫的數據
receiver = request.POST.get("receiver")  # 收件人
addr = request.POST.get("addr")  # 地址
zip_code = request.POST.get("zip_code")  # 郵編
phone = request.POST.get("phone")  # 手機號
  • step2  驗證數據完整性,郵編能夠不填
if not all([receiver, addr, phone]):
    return render(request, "user_center_site.html", {"error_msg":"數據不完整"})
  • step3 驗證手機號格式
if not re.match(r'^1[3|4|5|7|8|9][0-9]{9}$', phone):
    return render(request, "user_center_site.html", {"error_msg": "手機號格式不正確"})
  • step4 加收貨地址,當用戶已存在默認收貨地址,添加的地址不做爲默認收貨地址,不然做爲默認收貨地址, 由於此界面輸入登陸後的界面,因此django保存了user對象
user = request.user
try:
    address = Address.objects.get(user=user, is_default=True)
except Address.DoesNotExist:
    # 出現異常表示該用戶尚未設置默認地址
    address = None

if address:
    is_default = False
else:
    is_default = True
  • step5 保存收貨地址,跳轉到地址頁
Address.objects.create(user=user, receiver=receiver, addr=addr, zip_code=zip_code, phone=phone, is_default=is_default)
return redirect(reverse("user:address"))

2.在UserAddressView類get方法中獲取地址類Address對象

  • step1 經過登陸後的user對象在Address類中獲取該用戶的地址對象,根據該對象中的is_default字段,設置值爲True(也就是該用戶存在默認地址)進行數據庫df_address表查詢,若是出現異常表示該用戶並無收貨地,則設置address對象爲None,最後將address對象返回給前端模板
def get(self, request):
    """顯示頁面"""
    # 獲取用戶的的收貨地址
    user = request.user
    try:
        address = Address.objects.get(user=user, is_default=True)
    except Address.DoesNotExist:
        # 出現異常表示該用戶尚未設置默認地址
        address = None
    return render(request, "user_center_site.html", {"page":"address","address":address})
  • step2 在用戶地址前端模板文件中進行判斷,當後端返回的address對象不爲空時則從該對象中獲取用戶填寫的收件地址,收件人以及收件人電話,不然返回None
<div class="site_con">
	<dl>
	<dt>當前地址:</dt>
        {% if address %}
        <dd>{{ address.addr }} ({{ address.receiver }} 收) {{ address.phone }}</dd>
        {% else %}
        <dd style="color: red">無默認地址</dd>
        {% endif %}
	</dl>
</div>

3.測試

  • step1 添加收貨地址

  • step2 查看數據庫

 4.定義地址模型類管理器

  • step1  在df_use模塊models.py文件中建立AddressManager模型類,在類中定義一個方法用於操做模型類對應的數據表,將視圖中的UserAddressView類裏獲取登陸後用戶的地址對象代碼拷貝到此方法中,進行封裝
class AddressManager(models.Manager):
    """地址模型類管理器"""
    # 用於操做模型類對應的數據表
    def get_default_address(self, user):
        try:
            address = self.get(user=user, is_default=True)
        except self.model.DoesNotExist:
            # 出現異常表示該用戶尚未設置默認地址
            address = None

        return address
  • step2 在df_use模塊models.py文件中地址類(Address)中建立AddressManager的實例對象objects
objects = AddressManager()
  • step3 回到UserAddressView類視圖中,註釋掉try包含的代碼,直接經過調用Address.objects.get_default_address方法來獲取address對象
address = Address.objects.get_default_address(user)
  • step4 測試添加地址

說明:收貨地址欄能夠添加一個複選框,在這個複選框中顯示出該用戶全部的收貨地址,當選擇某一個收貨地址時,則設置改收貨地址的is_default值爲1

 七丶用戶中心-信息

1.顯示基本信息

  • step1 在UserInfoView類視圖get方法中獲取用戶基本信息
def get(self, request):
    """顯示頁面"""
    # 獲取用戶地址信息
    user = request.user
    address = Address.objects.get_default_address(user)
    return render(request, "user_center_info.html", {"page":"user", "address":address})
  • step2 在模板文件user_center_info.html中獲取後端返回的用戶地址信息對象,根據該對象來對頁面信息進行處理
<ul class="user_info_list">
	<li><span>用戶名:</span>{{ user.username }}</li>
    {% if address %}
	<li><span>聯繫方式:</span>{{ address.phone }}</li>
	<li><span>聯繫地址:</span>{{ address.addr }}</li>
    {% else %}
    <li><span>聯繫方式:</span>無</li>
	<li><span>聯繫地址:</span>無</li>
    {% endif %}
</ul>

2.獲取用戶歷史瀏覽記錄

  • step1 分析歷史瀏覽記錄存儲設計
1.何時添加歷史瀏覽記錄
  當用戶點擊進入某個商品詳情頁時,須要添加歷史瀏覽記錄
2.何時獲取歷史瀏覽記錄
  在用戶信息頁面顯示
3.歷史瀏覽記錄往哪裏存儲
  存儲在內存級的redis數據庫中提升讀寫效率
4.以哪一種數據格式進行存儲
  以list數據格式進行存儲
  • step2 經過django_redis包封裝好的get_redis_connection方法獲取redis中的StrictRedis類的實例對象 ,這個方法接收參數爲default與settings配置文件中django緩存數據庫設置名default一致
conn = get_redis_connection("default")
  • step3 設置redis數據庫的key
history_key = "history_%d" % user.id
  • step4 獲取用戶最新瀏覽的5個商品的id
sku_ids = conn.lrange(history_key, 0 ,4)
  • step5 遍歷查詢到的用戶sku_ids,根據遍歷出的的id查詢出對應的商品信息,之因此定義一個空列表是爲了讓存入列表中的商品信息,是以先進後出的方式進行排列,由於瀏覽記錄第一個便是用戶最後一個瀏覽的商品詳情
goods_list = []
for sku_id in sku_ids:
    goods = GoodsSKU.objects.get(id=sku_id)
    goods_list.append(goods)
  • step6 構造返回前端模板響應數據
content = {"page":"user",
           "address":address,
           "goods_list":goods_list
           }

return render(request, "user_center_info.html", content )
  • step7 在user_center_info模板文件中,獲取後端返回的數據,並進行判斷處理
{% for goods in goods_list %}
    <li>
        <a href="detail.html"><img src="{{ goods.image.url }}"></a>
        <h4><a href="detail.html">{{ goods.name }}</a></h4>
        <div class="operate">
            <span class="prize">¥{{ goods.price }}</span>
            <span class="unit">{{ goods.price }}/{{ goods.unite }}</span>
            <a href="#" class="add_goods" title="加入購物車"></a>
        </div>
    </li>
    {% empty %}
    無歷史瀏覽記錄
{% endfor %}
  • step8 直接刷新http://127.0.0.1:8000/user/用戶中心信息頁,由於商品詳情尚未作,因此數據庫中並無存儲歷史瀏覽的商品信息,因此顯示無歷史瀏覽記錄

八丶分佈式文件系統FastDFS

1.FastDFS是一個開源的輕量級分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題

2.該項目之因此使用FastDFS進行圖片存儲,而不使用django管理員網頁進行上傳,是由於使用FastDFS對海量存儲以及存儲擴容方便,同時也解決了同文件重複的問題

3.FastDFS架構圖

服務端兩個角色:

Tracker:管理集羣,tracker 也能夠實現集羣。每一個 tracker 節點地位平等。收集 Storage 集羣的狀態。 

Storage:實際保存文件 Storage 分爲多個組,每一個組之間保存的文件是不一樣的。每 個組內部能夠有多個成員,組成員內部保存的內容是同樣的,組成員的地位是一致的,沒有 主從的概念。 

4.文件上傳流程

說明:客戶端上傳文件後存儲服務器將文件 ID 返回給客戶端,此文件 ID 用於之後訪問該文 件的索引信息。文件索引信息包括:組名,虛擬磁盤路徑,數據兩級目錄,文件名

組名:文件上傳後所在的 storage 組名稱,在文件上傳成功後有 storage 服務器返回, 須要客戶端自行保存。 

虛擬磁盤路徑:storage 配置的虛擬路徑,與磁盤選項 store_path*對應。若是配置了 store_path0 則是 M00,若是配置了 store_path1 則是 M01,以此類推。 

數據兩級目錄:storage 服務器在每一個虛擬磁盤路徑下建立的兩級目錄,用於存儲數據 文件。 

文件名:與文件上傳時不一樣。是由存儲服務器根據特定信息生成,文件名包含:源存儲 服務器 IP 地址、文件建立時間戳、文件大小、隨機數和文件拓展名等信息

5.文件下載流程

6.開發環境搭建簡易FastDFS架構

7.FastDFS安裝

說明:FastDFS須要在Linux系統進行安裝,網上查了資料並無推出能夠在Windows環境下安裝的FastDFS版本,安裝FastDFS以前需安裝fastdfs依賴包libfastcommon-master.zip

  • step1 解壓縮libfastcommon-master.zip包,進入到libfastcommon-master的目錄中,執行 ./make.sh進行編譯

  • step2 執行 sudo ./make.sh install進行安裝

  • step3 解壓縮fastdfs-master.zip,進入到 fastdfs-master目錄中,執行 ./make.sh進行編譯

  • step4 執行 sudo ./make.sh install進行安裝

8.配置跟蹤服務器tracker

  •  step1 安裝完fdfs後在fdfd目錄下會產生一個fdfs的配置文件樣例 tracker.conf.sample,將該配置文件拷貝並重命名到當前路徑下名爲tracker.conf
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

  • step2 在/home/taogang/目錄中建立目錄 fastdfs/tracker兩個層級目錄,記得修改(/home/用戶名)

  • step3 編輯/etc/fdfs/tracker.conf配置文件,修改 base_path=/home/taogang/fastdfs/tracker
sudo vim /etc/fdfs/tracker.conf

9.配置存儲服務器storage 

  • step1 將fdfs目錄下的storage.conf.sample配置文件拷貝並重命名到當前路徑下名爲tracker.conf
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

  • step2 在/home/taogang/fastdfs/ 目錄中建立目錄 storage

  •  step3 編輯/etc/fdfs/storage.conf配置文件,修改以下配置
sudo vim /etc/fdfs/storage.conf
base_path=/home/taogang/fastdfs/storage

store_path0=/home/taogang/fastdfs/storage

tracker_server=你的ubuntu虛擬機的ip地址:22122

 

10.啓動tracker 和 storage

sudo service fdfs_trackerd start
sudo service fdfs_storaged start

11.測試是否安裝成功

  • step1 將fdfs目錄下的client.conf.sample配置文件拷貝並重命名到當前路徑下名爲client.conf
sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf 

  • step2 編輯/etc/fdfs/client.conf配置文件,修改以下配置
sudo vim /etc/fdfs/client.conf
base_path=/home/taogang/fastdfs/tracker
tracker_server=你的ubuntu虛擬機的ip地址:22122

  • step3 上傳文件測試,使用fdfs_upload_file /etc/fdfs/client.conf 要上傳的文件 ,若是返回相似group1/M00/00/00/xxxxxxxxxxxxxxxxxxxx.sql(上傳文件的後綴名)的文件id則說明文件上傳成功

九丶Nginx配置FastDFS使用的安裝和配置

1.說明:使用FastDFS分佈式系統架構在用戶量比較大的時候,用戶對內容的獲取效率是很是低的,爲了提升效率須要藉助Nginx服務器來配置FastDFS進行使用,Nginx服務器在處理靜態文件的效率是很高的,由於Nginx服務器內核是epoll,上傳資源使用fdfs系統,獲取資源則藉助nginx服務器來獲取;需安裝nginx-1.8.1.tar.gz和fastdfs-nginx-module-master.zip這兩個包,fastdfs-nginx-module-master.zip這個包的做用就是讓nginx服務器和fdfs系統進行關聯配置的做用

2.安裝nginx和fastdfs-nginx-module

  • step1 解壓縮 nginx-1.8.1.tar.gz和fastdfs-nginx-module-master.zip這兩個包,進入nginx-1.8.1目錄中,執行sudo ./configure --prefix=/usr/local/nginx/ --add-module=(fastdfs-nginx-module-master)解壓後的目錄的絕對路徑/src

結果報錯了,看提示是缺乏PCRE庫 

  • step2 安裝pcre,依次執行下面三條命令
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev
  • step3 安裝pcre成功後再次執行configure命令,生成Makefile成功

  • step4 編譯

  • step5 安裝 

  • step6 安裝成功後測試nginx是否安裝成功,執行./nginx -t ,結果報錯了,根據報錯提示,當前用戶對該nginx文件下的文件沒有讀寫操做,執行su root切換到root權限,再次執行提示成功

  • step7 拷貝fastdfs-nginx-module-master解壓後的目錄中src下的mod_fastdfs.conf 到 /etc/fdfs/mod_fastdfs.conf命名爲mod_fastdfs.conf

  • step8 編輯/etc/fdfs/mod_fastdfs.conf配置文件,進行如下修改
sudo vim /etc/fdfs/mod_fastdfs.conf
connect_timeout=10  # 鏈接fdfs超時時間
tracker_server=本身ubuntu虛擬機的ip地址:22122
url_have_group_name=true  # 訪問fdfs時帶不帶組的信息(group1)
store_path0=/home/python/fastdfs/storage

  •  step9 拷貝解壓縮的fastdfs-master目錄下conf目錄中http.conf和mime.types配置文件到 /etc/fdfs目錄下

  • step10 編輯/usr/local/nginx/conf/目錄下的nginx.conf配置文件,進行以下編寫
sudo vim /usr/local/nginx/conf/nginx.conf

  • step11 開啓nginx服務

3.測試Nginx服務器配合FastDFS系統進行文件上傳與獲取

  • step1 開啓fdfs服務,上傳桌面上的goods_detail.jpg圖片,返回文件id,這個id需記住,爲了下一步的測試

  • step2 打開瀏覽器輸入127.0.0.1:8888(nginx配置的端口)/(上傳成功返回的文件id),成功顯示出上傳的圖片

 十丶Python與FastDFS進行交互

  • step1 進入博主本身項目的虛擬環境(django_py2),使用pip安裝fdfs_client-py包

  • step2 查看虛擬環境中是否存在fdfs_client-py模塊

  • step3 上傳測試(上傳成功)

  • step5 概括:python做爲客戶端與fdfs系統進行交互並上傳文件成功,安裝nginx服務器配合fdfs系統使用成功,最後經過訪問配置nginx服務group[0-9]以及8888端口在瀏覽器中訪問python客戶端上產到fdfs系統上的文件,很是成功
相關文章
相關標籤/搜索