使用 django 实现一个计算请求的计数器
implementing a counter that counts requests with django
我正在尝试使用 Django,
我如何实现一个计数器来存储在数据库上服务的请求数?
我想统计 GET 请求,我应该怎么做才能让它起作用?
我的模板,
<form action="/submit/" method="GET">
<input type="text" name="q">
<input type="submit" value="Submit">
</form>
我的观点
def result(request):
name = request.GET['q']
message = 'your name is %r ' % name
return render(request, 'result.html', {'message': message})
我想计算我按下提交按钮的次数。我应该启动一个新应用程序 counter
还是存在其他实现计数器的方法?
您应该为计数器使用一些键值存储。例如,redis。它具有可用于计数器的内置方法 INCR:
有一些基于redis的django应用来存储计数器:
https://github.com/bradmontgomery/django-redis-metrics
https://github.com/Suor/django-counters
但我认为最好自己编写计数器代码,而不需要任何额外的 django 应用程序。有python-redis驱动:
https://pypi.python.org/pypi/redis/
正如您从文档中看到的那样,从 python.
与 redis 交互非常简单
嗯,session就是为了这个。
def result(request):
name = request.GET['q']
message = 'your name is %r ' % name
hit = request.session.get('hit')
if not hit:
request.session['hit'] = 1
else:
request.session['hit'] += 1
return render(request, 'result.html', {'message': message})
使用会话,您可以在请求之间存储信息。
这可能有点混乱,但您应该了解从会话中获得的基本概念,而不是 get 方法
model/.py 牵引你朋友的模型
friend = models.ForeignKey("self", related_name="referral", null=True, blank=True)
view.py这是你统计的朋友数
cool_obj = cool.objects.get(ref_id=ref_id)
obj = cool.objects.filter(friend=cool_obj)
count = cool_obj.referral.all().count()
这就是您通过中间件获取内容的方式
def home(request):
try:
cool_id = request.session['cool_id_ref']
obj = cool.objects.get(id=cool_id)
except:
obj = None
form = CoolJoin(request.POST or None)
if form.is_valid():
new_cool = form.save(commit=False)
email = form.cleaned_data['email']
new_cools, created = cool.objects.get_or_create(email=email)
if created:
new_cools.ref_id = get_ref_id()
if not obj == None:
new_cools.friend = obj
new_cools.ip_adress = get_ip(request)
new_cools.save()
return HttpResponseRedirect("/%s" %(new_cools.ref_id))
context = {"form": form}
template = "home.html"
return render(request, template, context)
middleware/py.
class ReferMiddleware():
def process_request(self, request):
ref_id = request.GET.get("ref")
try:
obj = cool.objects.get(ref_id = ref_id)
except:
obj = None
if obj:
request.session['cool_id_ref'] = obj.id
已经足够好了,但代码越少越好。
因此您可以使用装饰器以最少的代码完成最多的工作。
def counter(view_func):
def wrapper(request):
hit = request.session.get('hit')
if not hit:
request.session['hit'] = 1
else:
request.session['hit'] += 1
view_func(request)
return wrapper
@counter
def login_view(rquest):
return render(request, 'login.html')
我正在尝试使用 Django, 我如何实现一个计数器来存储在数据库上服务的请求数?
我想统计 GET 请求,我应该怎么做才能让它起作用?
我的模板,
<form action="/submit/" method="GET">
<input type="text" name="q">
<input type="submit" value="Submit">
</form>
我的观点
def result(request):
name = request.GET['q']
message = 'your name is %r ' % name
return render(request, 'result.html', {'message': message})
我想计算我按下提交按钮的次数。我应该启动一个新应用程序 counter
还是存在其他实现计数器的方法?
您应该为计数器使用一些键值存储。例如,redis。它具有可用于计数器的内置方法 INCR:
有一些基于redis的django应用来存储计数器:
https://github.com/bradmontgomery/django-redis-metrics
https://github.com/Suor/django-counters
但我认为最好自己编写计数器代码,而不需要任何额外的 django 应用程序。有python-redis驱动:
https://pypi.python.org/pypi/redis/
正如您从文档中看到的那样,从 python.
与 redis 交互非常简单嗯,session就是为了这个。
def result(request):
name = request.GET['q']
message = 'your name is %r ' % name
hit = request.session.get('hit')
if not hit:
request.session['hit'] = 1
else:
request.session['hit'] += 1
return render(request, 'result.html', {'message': message})
使用会话,您可以在请求之间存储信息。
这可能有点混乱,但您应该了解从会话中获得的基本概念,而不是 get 方法 model/.py 牵引你朋友的模型
friend = models.ForeignKey("self", related_name="referral", null=True, blank=True)
view.py这是你统计的朋友数
cool_obj = cool.objects.get(ref_id=ref_id)
obj = cool.objects.filter(friend=cool_obj)
count = cool_obj.referral.all().count()
这就是您通过中间件获取内容的方式
def home(request):
try:
cool_id = request.session['cool_id_ref']
obj = cool.objects.get(id=cool_id)
except:
obj = None
form = CoolJoin(request.POST or None)
if form.is_valid():
new_cool = form.save(commit=False)
email = form.cleaned_data['email']
new_cools, created = cool.objects.get_or_create(email=email)
if created:
new_cools.ref_id = get_ref_id()
if not obj == None:
new_cools.friend = obj
new_cools.ip_adress = get_ip(request)
new_cools.save()
return HttpResponseRedirect("/%s" %(new_cools.ref_id))
context = {"form": form}
template = "home.html"
return render(request, template, context)
middleware/py.
class ReferMiddleware():
def process_request(self, request):
ref_id = request.GET.get("ref")
try:
obj = cool.objects.get(ref_id = ref_id)
except:
obj = None
if obj:
request.session['cool_id_ref'] = obj.id
因此您可以使用装饰器以最少的代码完成最多的工作。
def counter(view_func):
def wrapper(request):
hit = request.session.get('hit')
if not hit:
request.session['hit'] = 1
else:
request.session['hit'] += 1
view_func(request)
return wrapper
@counter
def login_view(rquest):
return render(request, 'login.html')