基于Django的火车票信息查询功能实现

整体样式与效果:

(文末附项目链接)

1.后端

        后端用Django框架开发,Django是可以快速部署web应用的python语言框架(pycharm专业版),Django的各个文件的功能简述:

        1)urls:接口路径文件,配置接口与视图文件中函数的对应关系。

        2)views:视图函数文件,开发具体的业务。

        3)settings:项目的设置文件,数据库、注册应用、端口访问控制、日志等等的设置。

        4)models:数据库的定义文件,定义项目需要的数据库(数据库地址需要提前配置好)。

        5)manage:项目管理文件,一般用于项目的配置的管理。

        6)apps:项目应用的注册类文件,建立Django项目进行开发前需要先注册应用。

        以下是建立项目的过程,先建立一个Django项目,我用的pycharm2024.1.2,专业版:

创建后需要先注册应用,在终端中运行:

python manage.py startapp agent_12306

注册成功后,左侧项目目录中会多出一个对应文件夹,这里就是开发应用的目录。

需要在settings.py文件中添加注册好的应用,即:

这样写是因为,apps.py是注册应用的文件,里面有应用注册的类,需要在这里指明。

        在项目中额外创建一个模板文件夹tem,替代原来的模板文件,用于存放前端页面,当然本文这里的页面是独立静态的,没有用到django框架前端的继承和传输数据的语法,相当于一个轻量级的前后端分离。

到此,项目的主体结构搭建完毕。

        代码

        要想实现火车票信息的查询功能,后端需要满足以下几点:

        1)拥有12306网站的车票查询接口,用于数据查询。

        2)拥有全国每个城市及其包含的所有车站的名称,用于用户检索。

        3)规范接口接收和返回的参数。

关于问题1),我们采用12306官方网站->信息查询->票价查询功能的接口queryAllPublicPrice:

(声明:本项目调用此接口仅为低频率的查询操作(GET请求)用于互相交流学习,各位同仁调用时须遵守相关法律法规,不要恶意高频访问)。

关于问题2),本项目有一个json文件,里面存储了全国每个车站的信息(所在城市、车站代码等等),这些信息是通过tests.py里的代码生成,参考项目里的tests.py文件。

关于问题3),本项目规定的前端传来的参数有三个:出发车站、到达车站、出发时间,对应的参数名:

start_station#出发车站,举例:北京
end_station#到达车站,举例:石家庄
date#出发日期,举例:2024-10-25,上述信息均为字符串格式

返回的参数:

#一列火车的基本信息
"train_code" # 车次编号
"train_begin" # 始发站
"train_end" # 终点站
"train_start" # 出发车站
"train_stop" # 到达车站
"train_start_time"# 出发时间
"train_stop_time"   # 到达时间
"train_day_difference" #  隔天的天数(当天出发没有当天到称为隔天)
"train_class_name"# 火车类型
"train_run_time"# 火车历时多久到达目的地

#下列参数如果该列火车没有,则传给前端空值
"one_level_price" #一等座价格
"two_level_price"  #二等座价格
"swz_price"#商务座价格
"yz_price" #硬座价格
"yw_price" #硬卧价格
"rw_price" #软卧价格
"rz_price" # 软座价格
"gr_price" # 高软,即高级软卧价格
"srrb_price" # 动卧,动车卧铺价格
"tz_price" #特等座价格

        系统设计主要思路为:前端传来请求,后端解析参数,二次调用12306的接口进行信息查询,将结果进行解析,传至前端进行展示。那么就有哥哥姐姐弟弟妹妹要问了,为什么不直接用Vue设计一个前端系统,直接调官方接口就完事了?

        有道理!全文结束!(开个玩笑别介意哈哈哈)

        事实上不选择开发前端系统直接调用12306的接口,一方面是参数需要有一个处理的过程,官方接口方便的同时传回来的数据有局限性,前端优化新功能会受到限制,另一方面是一些数据比较重要,需要专门的方案来管理与调度,即需要针对数据的单独业务。项目体量比较小的时候,前后端的分离逻辑本来就是比较模糊,现在的js都可以作为后端语言,django、flask等python后端框架可以实现前后端不分离,介于两者之间,本文选择了前轻后重的开发模式,各位可以选择后续进行优化。

        先在urls中定义好接口:

from django.contrib import admin
from django.urls import path
from agent_12306 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/index_train_data/', views.index.as_view()),#这里将我们的index类作为视图函数去调用
]

        在views中具体实现查询的功能:

import json
import requests
from django.http import JsonResponse
from django.views import View
class index(View):#index视图函数的所有引用函数在此类里
    file_path_station_dict = 'agent_12306/station_dict.json'#配置文件路径
    def get(self,request):#index类中处理GET请求的方法
        try:
            start_station = request.GET.get('start_station')
            end_station = request.GET.get('end_station')
            date = request.GET.get('date')
            if start_station == "" or end_station == "" or date == "":  # 验证参数是否为空
                dic = {
                    "msg": "输入参数错误!",
                    "data": []
                }
            else:
                # 根据起始位置获取对应的车站代码
                start_station_code, end_station_code = self.get_code_by_name(start_station, end_station)

                # 根据起始位置的车站代码和日期,查询车票数据
                data = self.get_price_text(date, start_station_code, end_station_code)

                list_keys = []#存放车票种类的列表
                if data:#如果有数据
                    for i in data:#得到该区间所有开行车票的种类
                        price_keys = [key for key in i.get('queryLeftNewDTO').keys() if key.endswith('_price')]
                        for key in price_keys:
                            if k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值