Django两函数通信与数据共享:如何传递ref_location参数
解决方案
报错原因
你定义的EvenDataPoint作为Django视图函数时,Django路由默认只会自动传入request参数,你额外要求的ref_location参数没有对应传入逻辑,同时两个视图属于独立的HTTP请求上下文,第一个视图计算出的ref_location会在请求结束后销毁,无法直接被第二个视图读取。
可行实现方案
方案1:视图内部直接调用
如果你需要在even_point处理逻辑中直接返回EvenDataPoint的结果,直接在第一个视图内传入参数调用即可:
def even_point(request): longitude=request.POST['longitude'] latitude=request.POST['latitude'] ref_location = Point(float(longitude), float(latitude)) # 直接调用第二个视图并返回结果 return EvenDataPoint(request, ref_location) def EvenDataPoint(request, ref_location): # *注意修正笔误:Even.objects 不是 Evenobjects* name = serialize('geojson', Even.objects.filter(geom__contains=ref_location)) return HttpResponse(name,content_type='json')
方案2:独立请求场景用Session存储
如果两个视图对应两次独立的用户请求(比如用户先访问even_point返回页面,再由页面前端发起请求调用EvenDataPoint接口),可以把经纬度存入会话Session共享:
def even_point(request): longitude=request.POST['longitude'] latitude=request.POST['latitude'] ref_location = Point(float(longitude), float(latitude)) # 存入Session request.session['ref_lng'] = longitude request.session['ref_lat'] = latitude all_evens = Even.objects.all() return render(request, 'even_map_point.html', {'all_evens': all_evens, 'longitude':longitude, 'latitude':latitude, 'ref_location':ref_location}) def EvenDataPoint(request): # 从Session读取坐标生成Point lng = request.session.get('ref_lng') lat = request.session.get('ref_lat') if not lng or not lat: return HttpResponse("缺少位置参数", status=400) ref_location = Point(float(lng), float(lat)) name = serialize('geojson', Even.objects.filter(geom__contains=ref_location)) return HttpResponse(name,content_type='json')
Django默认已开启Session中间件,无需额外配置即可使用。
方案3:前端传参
也可以在前端调用EvenDataPoint接口时,把已经拿到的经纬度作为查询参数传递:
前端请求示例:/你的接口路径/?lng=116.40&lat=39.90
对应视图代码:
def EvenDataPoint(request): lng = request.GET.get('lng') lat = request.GET.get('lat') if not lng or not lat: return HttpResponse("缺少位置参数", status=400) ref_location = Point(float(lng), float(lat)) name = serialize('geojson', Even.objects.filter(geom__contains=ref_location)) return HttpResponse(name,content_type='json')
方案4:抽离公共逻辑为工具函数
如果两个视图都需要用到坐标生成逻辑,可以把公共代码抽成独立工具函数,避免重复代码:
# 抽离的公共工具函数 def get_ref_location_from_request(request): longitude = request.POST.get('longitude') or request.GET.get('longitude') latitude = request.POST.get('latitude') or request.GET.get('latitude') if longitude and latitude: return Point(float(longitude), float(latitude)) return None def even_point(request): ref_location = get_ref_location_from_request(request) if not ref_location: # 自行补充缺参数的错误处理 pass all_evens = Even.objects.all() return render(request, 'even_map_point.html', {'all_evens': all_evens, 'longitude':longitude, 'latitude':latitude, 'ref_location':ref_location}) def EvenDataPoint(request): ref_location = get_ref_location_from_request(request) if not ref_location: return HttpResponse("缺少位置参数", status=400) name = serialize('geojson', Even.objects.filter(geom__contains=ref_location)) return HttpResponse(name,content_type='json')
其他注意事项
- 务必修正代码笔误:
Evenobjects要改为Even.objects,否则会触发名称不存在报错 - 建议对入参的经纬度增加合法性校验,避免非法值导致程序异常
内容的提问来源于stack exchange,提问作者Saliha Alger
相关产品推荐
相关产品推荐

