本講會對種子搜索網站的開發過程進行詳細的講解。
源碼地址: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 = '' |
繼承了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
|