本講會對種子搜尋網站的開發過程進行詳細的講解。
網站演示: https://bt.mypython.me
原始碼地址: https://github.com/geeeeeeeek/bt
專案開發過程
專案簡介
該專案是基於python的web類庫django開發的一套web網站,做為本人的畢業設計。 本人的研究方向是一項關於搜尋的研究專案。在該專案中,筆者開發了一個簡單版的搜尋網站,實現了對資料庫資料的檢索和更新。 網站域名為bt.mypython.me
啟動專案
django-admin startproject bt
複製程式碼
建立應用
python3 manage.py startapp app
複製程式碼
model設計
主要是對提交的連結進行設計,在此專案中,我們需要展示連結的名稱、url、聯絡人、連結簡介等欄位。
設計欄位如下:
class Link(models.Model):
list_display = ("url","desc","contact")
url = models.CharField(max_length=100,blank=True, null=True)
title = models.CharField(max_length=100,blank=True, null=True)
size = models.CharField(max_length=100,blank=True, null=True)
hot = models.IntegerField(default=0)
desc = models.CharField(max_length=200,blank=True, null=True)
contact = models.CharField(max_length=100,blank=True, null=True)
status = models.BooleanField(default=False)
timestamp = models.DateTimeField(auto_now_add=True, null=True)
objects = LinkQuerySet.as_manager()
複製程式碼
業務編寫
本專案一共分為4個頁面,分別是首頁、搜尋列表頁、詳情頁、連結提交頁。
我們一一講解
首頁
首先是首頁,它的模版位於templates/app/index.html 它主要是用來展示首頁內容, 並提交搜尋詞,到搜尋介面,所有的介面都位於app/urls.py裡面,如下
app_name = 'app'
urlpatterns = [
path('index', views.IndexView.as_view(), name='index'),
path('search', views.SearchView.as_view(), name='search'),
path('detail/<int:pk>', views.DetailView.as_view(), name='detail'),
path('commit', views.CommitView.as_view(), name='commit'),
]
複製程式碼
我們設定首頁的路由為IndexView, 開始編寫IndexView的程式碼。它的程式碼非常簡單:
class IndexView(generic.TemplateView):
template_name = 'app/index.html'
複製程式碼
僅僅是展示了首頁頁面,首頁將搜尋詞交給了search來處理,這一點,我們從index.html關於form的程式碼中可以看到, 提交給了url 'app:search'
<form id="search-form" action="{% url 'app:search' %}" enctype="multipart/form-data" method="get" role="form">
<input type="text" id="search" name="q" autocomplete="off" placeholder="搜搜你懂的">
<input type="submit" id="btnSearch" value="搜 索" class="blue">
</form>
複製程式碼
列表展示頁
從urls.py中可知,app:search指向了SearchView,這個類是本專案的核心程式碼,它實現了搜尋的全過程。
class SearchView(generic.ListView):
model = Link
template_name = 'app/search.html'
context_object_name = 'link_list'
paginate_by = 10
q = '' # 搜尋詞
duration = 0 # 耗時
record_count = 0
def get_context_data(self, *, object_list=None, **kwargs):
context = super(SearchView, self).get_context_data(**kwargs)
paginator = context.get('paginator')
page = context.get('page_obj')
page_list = get_page_list(paginator, page)
context['page_list'] = page_list
context['q'] = self.q
context['duration'] = round(self.duration,6)
context['record_count'] = self.record_count
return context
def get_queryset(self):
start = time.time()
self.q = self.request.GET.get("q", "")
search_list = Link.objects.get_search_list(self.q)
# 如搜尋為空,則放假資料
if len(search_list) <= 0:
search_list = Link.objects.get_fake_list()
end = time.time()
self.duration = end - start
self.record_count = len(search_list)
return search_list
複製程式碼
繼承了ListView通用類,通過get_queryset()回撥函式來實現搜尋功能,並通過get_context_data來傳遞額外的資料給前端。即是列表展示頁。
詳情頁
我們再來開發詳情頁,從urls.py中看到,詳情頁是由DetailView來實現的,我們來窺探它的全貌:
class DetailView(generic.DetailView):
model = Link
template_name = 'app/detail.html'
def get_object(self, queryset=None):
obj = super().get_object()
obj.increase_hot_count()
return obj
def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs)
recommend_list = Link.objects.get_recommend_list()
context['recommend_list'] = recommend_list
return context
複製程式碼
它很簡單,繼承了DetailView通用模板類來顯示詳情。
連結提交頁
最後再來看一下連結提交頁,它是由CommitView來實現的。同樣是觀看程式碼:
class CommitView(generic.CreateView):
model = Link
form_class = CommitForm
template_name = 'app/commit.html'
@ratelimit(key='ip', rate='2/m')
def post(self, request, *args, **kwargs):
was_limited = getattr(request, 'limited', False)
if was_limited:
messages.warning(self.request, "操作太頻繁了,請1分鐘後再試")
return render(request, 'app/commit.html', {'form': CommitForm()})
return super().post(request, *args, **kwargs)
def get_success_url(self):
messages.success(self.request, "提交成功! 稽核期3個工作日。")
return reverse('app:commit')
複製程式碼
它是繼承自CreateView,因為是建立操作嘛,在post中,我們通過ratelimit來限制提交次數。
執行專案
python3 manage.py runserver
複製程式碼