前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于python的种子搜索网站(二)开发过程

基于python的种子搜索网站(二)开发过程

原创
作者头像
西门吹雪1997
修改2019-03-08 16:56:35
1.2K2
修改2019-03-08 16:56:35
举报

本讲会对种子搜索网站的开发过程进行详细的讲解。

网站演示: https://bt.mypython.me

源码地址: https://github.com/geeeeeeeek/bt

项目开发过程

项目简介

该项目是基于python的web类库django开发的一套web网站,做为本人的毕业设计。

本人的研究方向是一项关于搜索的研究项目。在该项目中,笔者开发了一个简单版的搜索网站,实现了对数据库数据的检索和更新。 网站域名为bt.mypython.me

启动项目

代码语言:txt
复制
django-admin startproject bt 

创建应用

代码语言:txt
复制
python3 manage.py startapp app

model设计

主要是对提交的链接进行设计,在此项目中,我们需要展示链接的名称、url、联系人、链接简介等字段。

设计字段如下:

代码语言:txt
复制
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里面,如下

代码语言:txt
复制
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的代码。它的代码非常简单:

代码语言:txt
复制
class IndexView(generic.TemplateView):

    template\_name = 'app/index.html'

仅仅是展示了首页页面,首页将搜索词交给了search来处理,这一点,我们从index.html关于form的代码中可以看到, 提交给了url 'app:search'

代码语言:txt
复制
 <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,这个类是本项目的核心代码,它实现了搜索的全过程。

代码语言:txt
复制
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来实现的,我们来窥探它的全貌:

代码语言:txt
复制
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来实现的。同样是观看代码:

代码语言:txt
复制
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来限制提交次数。

运行项目

代码语言:txt
复制
python3 manage.py runserve

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目开发过程
    • 项目简介
      • 启动项目
        • 创建应用
          • model设计
            • 业务编写
              • 首页
              • 列表展示页
              • 详情页
              • 链接提交页
            • 运行项目
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档