赞
踩
最近到了做毕设的时间了,很多小伙伴都选择了房源推荐/可视化系统,那么我就用Python的Django给大家做一个吧!
所用到的技术栈:
Django是高水准的Python编程语言驱动的一个开源模型.视图,控制器风格的Web应用程序框架,它起源于开源社区。使用这种架构,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序。这也正是OpenStack的Horizon组件采用这种架构进行设计的主要原因。另外,在Dj ango框架中,还包含许多功能强大的第三方插件,使得Django具有较强的可扩展性 [2] 。Django 项目源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:
用于创建模型的对象关系映射;
为最终用户设计较好的管理界面;
URL 设计;
设计者友好的模板语言;
缓存系统。
django logo
Django(发音:[`dʒæŋɡəʊ]) 是用python语言写的开源web开发框架(open source web framework),它鼓励快速开发,并遵循MVC设计。Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 。
Django 根据比利时的爵士音乐家Django Reinhardt命名,他是一个吉普赛人,主要以演奏吉它为主,还演奏过小提琴等。
由于Django在近年来的迅速发展,应用越来越广泛,被著名IT开发杂志SD Times评选为2013 SD Times 100,位列“API、库和框架”分类第6位,被认为是该领域的佼佼者 [3] 。
(一)数据获取
1、获取租房房源信息
很抱歉,由于爬虫部分涉及具体网站造成侵权行为,故删除此部分代码
(二)数据库
加上Django数据迁移的表,一共这些表
数据库连接
用pymysql连接本地mysql数据库,首先通过pip安装pymysql并创建好数据库以及数据库表,导入pymysql包,打开数据库连接,使用cursor()方法创建一个游标对象,使用execute()方法执行SQL查询
(三)登陆流程
实现代码:
登陆:
- def login(request):
- if request.session.get('is_login', None):
- return redirect('/index')
-
- if request.method == "POST":
- login_form = UserForm(request.POST)
- message = "请检查填写的内容!"
- if login_form.is_valid():
- username = login_form.cleaned_data['username']
- password = login_form.cleaned_data['password']
- try:
- user = models.userinfo.objects.get(name=username)
- print(user.name)
- if user.password == hash_code(password):
- request.session['is_login'] = True
- request.session['user_id'] = user.id
- request.session['user_name'] = user.name
- return redirect('/')
- else:
- message = "密码不正确!"
- except:
- message = "用户不存在!"
- return render(request, 'login.html', locals())
-
- login_form = UserForm()
- return render(request, 'login.html', locals())

注册:
- def register(request):
- if request.session.get('is_login', None):
- # 登录状态不允许注册。
- return redirect("/")
- if request.method == "POST":
- register_form = RegisterForm(request.POST)
- message = "请检查填写的内容!"
- if register_form.is_valid(): # 获取数据
- username = register_form.cleaned_data['username']
- password1 = register_form.cleaned_data['password1']
- password2 = register_form.cleaned_data['password2']
- email = register_form.cleaned_data['email']
- sex = register_form.cleaned_data['sex']
- if password1 != password2: # 判断两次密码是否相同
- message = "两次输入的密码不同!"
- return render(request, 'register.html', locals())
- elif len(password1)<6:
- message = "密码必须大于6位!"
- else:
- same_name_user = models.userinfo.objects.filter(name=username)
- if same_name_user: # 用户名唯一
- message = '用户已经存在,请重新选择用户名!'
- return render(request, 'register.html', locals())
- same_email_user = models.userinfo.objects.filter(email=email)
- if same_email_user: # 邮箱地址唯一
- message = '该邮箱地址已被注册,请使用别的邮箱!'
- return render(request, 'register.html', locals())
-
- # 创建新用户
- new_user = models.userinfo.objects.create()
- new_user.name = username
- new_user.password = hash_code(password1)
- new_user.email = email
- new_user.sex = sex
- new_user.save()
- new_collection = models.Collection.objects.create()
- new_collection.name = username
- new_collection.count = 0
- new_collection.save()
- return redirect('/login/') # 自动跳转到登录页面
- register_form = RegisterForm()
- return render(request, 'register.html', locals())

(四)首页功能
(五)个人中心
数据分析代码:
- @csrf_exempt
- def chart(request):
- district_item = set(models.zufang.objects.values_list('district'))
- district_item = [i[0] for i in district_item]
- if request.method == "GET":
- selected = district_item[0]
- area_item = set(models.zufang.objects.values_list('area').filter(district=selected))
- area_item = [i[0] for i in area_item]
-
- else:
- show_chart = False
- area_item = set(models.zufang.objects.values_list('area').filter(district=request.POST.get('options1')))
- area_item = [i[0] for i in area_item]
- print(request.POST.get('options1'))
- print(request.POST.get('options2'))
- zufang_totol = models.zufang.objects.values().filter(
- district=request.POST.get('options1'),
- area=request.POST.get('options2'))
- print(zufang_totol.count())
- if zufang_totol.count() > 0:
- zheng_list = []
- he_list = []
- show_chart = True
- for i in zufang_totol:
- if i['form'] == "整租":
- j = list([int(i['price'].strip('-')), int(i['size'].strip('平米'))])
- zheng_list.append(j)
- else:
- j = list([int(i['price'].strip('-')), int(i['size'].strip('平米'))])
- he_list.append(j)
- return JsonResponse(
- {"area_item": area_item, "zheng_list": zheng_list, "he_list": he_list, "show_chart": show_chart},
- safe=False)
- else:
- show_chart = False
- return JsonResponse({"area_item": area_item, "show_chart": show_chart}, safe=False)
-
- return render(request, 'chart.html', locals())

价格预测代码:
- @csrf_exempt
- def price(request):
- if request.method == "GET":
- contact_list = models.zufang.objects.values_list().order_by('id')
- contact_list = [i for i in contact_list]
- new_contact_list = random.sample(contact_list, 3)
- user_name = models.Collection.objects.get(name=request.session.get('user_name'))
- if user_name.count > 0:
- collection = user_name.collection
- collection = collection.split(",")
- collection = [int(i) for i in collection]
- find_index = []
- for item in collection:
- find_index.append(models.zufang.objects.values_list().filter(id=item)[0])
- find_index = [i for i in find_index]
- else:
- collection = []
- find_index = []
- if request.GET.get("update_item") == "ok":
- return JsonResponse({"new_contact_list": new_contact_list, "find_index": find_index}, safe=False)
- return render(request, 'price.html', locals())
-
- else:
- user_name = models.Collection.objects.get(name=request.session.get('user_name'))
- count = user_name.count
- if user_name.count > 0:
- collection = user_name.collection
- collection = collection.split(",")
- else:
- collection = []
- if request.POST.get("new") == "true":
- count += 1
- new_collection = request.POST.get("data_id")
- collection.append(new_collection)
- collection = ','.join(collection)
- new = models.Collection.objects.get(name=request.session.get('user_name'))
- new.collection = collection
- new.count = count
- new.save()
- else:
- count -= 1
- new_collection = request.POST.get("data_id")
- collection.remove(new_collection)
- collection = ','.join(collection)
- new = models.Collection.objects.get(name=request.session.get('user_name'))
- new.collection = collection
- new.count = count
- new.save()
-
- return JsonResponse({}, safe=False)

项目不足:目前并未实时爬取数据存入数据库,导致数据更新不及时,有能力的朋友可以自己爬取数据存储
---------------------------------------------------------------------------------------------------------------------------------
1)新增链家官网爬虫,可以将最新的数据实时存储到数据库
2)之前版本主页全是一张图作为房源的缩略图,现因为数据库增加了picture和link字段,故每个房源均为不同的缩略图且能跳转到链家官网
3)根据用户收藏行为,新增协同推荐算法
(4)更新预测模型,正确填写信息之后,将会使用预测模型预测出来价格
(5)由于数据库的数据结构改变,故发布房源增加图片url和跳转url输入框
综上。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。