基於python的種子搜索網站--開發過程

本講會對種子搜索網站的開發過程進行詳細的講解。html

網站演示: https://bt.mypython.me前端

源碼地址: https://github.com/geeeeeeeek/btpython

項目開發過程

項目簡介

該項目是基於python的web類庫django開發的一套web網站,作爲本人的畢業設計。 本人的研究方向是一項關於搜索的研究項目。在該項目中,筆者開發了一個簡單版的搜索網站,實現了對數據庫數據的檢索和更新。 網站域名爲bt.mypython.megit

啓動項目

django-admin startproject bt 
複製代碼

建立應用

python3 manage.py startapp app
複製代碼

model設計

主要是對提交的連接進行設計,在此項目中,咱們須要展現連接的名稱、url、聯繫人、連接簡介等字段。github

設計字段以下:web

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個頁面,分別是首頁、搜索列表頁、詳情頁、連接提交頁。數據庫

咱們一一講解django

首頁

首先是首頁,它的模版位於templates/app/index.html 它主要是用來展現首頁內容, 並提交搜索詞,到搜索接口,全部的接口都位於app/urls.py裏面,以下bash

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的代碼。它的代碼很是簡單:app

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
複製代碼
相關文章
相關標籤/搜索