毕设-基于 Python 的种子搜索网站开发 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
lovezww2011

毕设-基于 Python 的种子搜索网站开发

  •  
  •   lovezww2011
    geeeeeeeek Mar 11, 2019 4009 views
    This topic created in 2604 days ago, the information mentioned may be changed or developed.

    网站演示: 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 
    19 replies    2019-03-12 15:07:26 +08:00
    zbl430
        1
    zbl430  
       Mar 11, 2019
    建议用 es 做搜索
    devtk
        2
    devtk  
       Mar 11, 2019   1
    以前用 twisted 写过一个 DHT network 的爬虫,看标题以为和我写的东西差不多 原来只是个展示的壳子...
    meiyoumingzi6
        3
    meiyoumingzi6  
       Mar 11, 2019
    Page not found (404)
    Request Method: GET
    Request URL: https://bt.mypython.me/23333
    Using the URLconf defined in bt.urls, Django tried these URL patterns, in this order:

    admin/
    app/
    [name='home']
    The current path, 23333, didn't match any of these.

    You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.





    所以 debug 模式也不关掉么
    ByteChen
        4
    ByteChen  
       Mar 11, 2019
    搜索不够准确哦 尤其在没有符合的目标的时候 没有反馈
    huangdayu
        5
    huangdayu  
       Mar 11, 2019
    搜索似乎不太理想,排序似乎无效?
    cc3630
        6
    cc3630  
       Mar 11, 2019
    说实话,这个毕设有点简单了,几天就能完成。。。
    lovezww2011
        7
    lovezww2011  
    OP
       Mar 11, 2019
    @huangdayu 因为库里的数据太少了,所以当没有搜索到的时候,只抛给用户一些假数据。 首页搜索栏下面的那几个是可以搜到的。^_^
    chuanwu
        8
    chuanwu  
       Mar 11, 2019
    lovezww2011
        9
    lovezww2011  
    OP
       Mar 11, 2019
    @chuanwu 请不要泄漏密码。^-^
    chuanwu
        10
    chuanwu  
       Mar 11, 2019
    @lovezww2011 截图里我打马赛克了 relax
    yuzhiquan
        11
    yuzhiquan  
       Mar 11, 2019
    话说 django admin 不是这个样子啊
    Trim21
        12
    Trim21  
       Mar 11, 2019 via Android
    点进来之前以为是 dht 搜索的那种…
    rust
        13
    rust  
       Mar 11, 2019 via Android
    现在的大学生就这么弱?
    enrolls
        14
    enrolls  
       Mar 12, 2019
    直接给你成品,YUhSMGNEb3ZMM052ZFhOdmRXTnBiR2t1WTI5dEx3PT0= ,上次搜 TVB 缺失电视剧的时候发现的。
    lovezww2011
        15
    lovezww2011  
    OP
       Mar 12, 2019
    @enrolls 成品?什么成品?片子吗
    lingo
        16
    lingo  
       Mar 12, 2019
    @enrolls 两层,讲究。不过这站好清爽。
    polebug
        17
    polebug  
       Mar 12, 2019 via Android
    ....这毕设也太水了 两天就能搞完...
    Sephiro
        18
    Sephiro  
       Mar 12, 2019
    是不是太划了 有些简单过头了
    lovezww2011
        19
    lovezww2011  
    OP
       Mar 12, 2019
    @polebug 专科学校的毕业设计,都很水。
    About     Help     Advertise     Blog     API     FAQ     Solana     4713 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 98ms UTC 04:05 PVG 12:05 LAX 21:05 JFK 00:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86