Click here to Skip to main content
15,867,308 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
I am trying to make an IP Logger plus URL shortener.
It says problem with line 82 in views.py - store_links.save()
Getting an error: NOT NULL constraint failed: MyServer_links.redirect_url

What I have tried:

**views.py**
Python
  1  from django.shortcuts import render,redirect
  2  from django.http import HttpResponse
  3  from django.http import JsonResponse
  4  from django.http import HttpResponseRedirect
  5  from django.views.decorators.csrf import csrf_exempt
  6  from MyServer.models import *
  7  
  8  
  9  import string 
 10  import random
 11  import re
 12  from datetime import datetime
 13  import json
 14  import os
 15  
 16  # TRACKING_DOMAIN_NAME = "http://127.0.0.1:8000/tracking"
 17  # DOMAIN_NAME = "http://127.0.0.1:8000"
 18  TRACKING_DOMAIN_NAME = '127.0.0.1:8000'
 19  DOMAIN_NAME = '127.0.0.1:8000'
 20  
 21  
 22  # Create your views here.
 23  
 24  def formaturl(url):
 25      if not re.match('(?:http|ftp|https)://', url):
 26          return 'http://{}'.format(url)
 27      return url
 28  
 29  
 30  def get_client_ip(request):
 31      x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
 32      if x_forwarded_for:
 33          ip = x_forwarded_for.split(',')[0]
 34      else:
 35          ip = request.META.get('REMOTE_ADDR')
 36      return ip
 37  
 38  
 39  def get_client_data(request):
 40  	browser = request.user_agent.browser.family + " "+ request.user_agent.browser.version_string
 41  	os = request.user_agent.os.family + " "+ request.user_agent.os.version_string
 42  	device = request.user_agent.device.family
 43  
 44  	device_type=""
 45  
 46  	if(request.user_agent.is_mobile):
 47  		device_type="Mobile"
 48  
 49  	if(request.user_agent.is_tablet):
 50  		device_type="Tablet"
 51  
 52  	if(request.user_agent.is_pc):
 53  		device_type="PC/Laptop"
 54  
 55  	if(request.user_agent.is_bot):
 56  		device="bot"
 57  
 58  	resp = {"browser":browser,"os":os,"device_type":device_type,"device":device}
 59  
 60  	print(resp)
 61  	return resp
 62  
 63  
 64  
 65  @csrf_exempt
 66  def create_shortened_url(request):
 67  	original_url = request.GET.get('127.0.0.1:8000')
 68             
 69  	random_chars = ''.join(random.choices(string.ascii_uppercase + string.digits, k = 6))
 70  	random_chars2 = ''.join(random.choices(string.ascii_uppercase + string.digits, k = 5))
 71  
 72  	#append to domain name
 73  	shortened_link = DOMAIN_NAME + "/" + random_chars
 74  	tracking_link = TRACKING_DOMAIN_NAME + "/" + random_chars2
 75  
 76  	#What if randomly generated chars already exist?
 77  	#Check the url in db before comitting - FUTUTRE WORK
 78  
 79  	
 80  	#Store in the DB
 81  	store_links = Links(short_url=shortened_link,redirect_url=original_url,tracking_url=tracking_link)
 82  	store_links.save()
 83  
 84  	print("LINK SHORTENED : ",shortened_link)
 85  	# return JsonResponse({'shortened_link':shortened_link,'tracking_link':tracking_link})
 86  	return render(request,'index.html',context={'shortened_link':shortened_link,'tracking_link':tracking_link})
 87  
 88  
 89  def redirect_test(request):
 90  	return redirect("https://facebook.com")
 91  
 92  def ip_test(request):
 93  	return HttpResponse(get_client_ip(request))
 94  
 95  def user_agent_test(request):
 96  	browser = request.user_agent.browser.family
 97  	os = request.user_agent.os.family
 98  	device = request.user_agent.device.family
 99  
100  	if(request.user_agent.is_pc):
101  		device = "PC"
102  	return HttpResponse(browser+"\n"+os+" "+device)
103  
104  
105  def redirect_now(request,short_link):
106  	shortened_link = DOMAIN_NAME + "/" + short_link.strip()
107  
108  	#fetch for this in DB and retrieve the redirect URL
109  	fetched = Links.objects.filter(short_url=shortened_link).first()
110  
111  	redirect_url = formaturl(fetched.redirect_url)
112  
113  	client_data = get_client_data(request)
114  
115  	now = datetime.now()
116  	dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
117  
118  
119  	#Before redirecting, log neccessary data into DB
120  	log_data = TrackingData(tracking_url=fetched.tracking_url,short_url=shortened_link,
121  		ip_address=get_client_ip(request),browser=client_data['browser'],os=client_data['os']
122  		,device_type=client_data['device_type'],device=client_data['device'],time=dt_string)
123  
124  	log_data.save()
125  
126  
127  	return redirect(redirect_url)
128  
129  
130  def fetch_tracking_data(request,tracking_link):
131  	tracking_url = TRACKING_DOMAIN_NAME + "/" + tracking_link.strip()
132  	fetch = TrackingData.objects.filter(tracking_url=tracking_url)
133  
134  	res = []
135  	k = 1
136  	for row in fetch:
137  		
138  		temp = {}
139  		temp['ip_address'] = row.ip_address
140  		temp['browser'] = row.browser
141  		temp['os'] = row.os
142  		temp['device_type'] = row.device_type
143  		temp['device'] = row.device
144  		temp['time'] = row.time
145  
146  		res.append(temp)
147  		# res['Device'+str(k)] = temp
148  		# k+=1
149  
150  
151  
152  	# return JsonResponse(json.dumps(res),safe=False)
153  	print("resp : ",res)
154  	return render(request,'tracking_display.html',{'resp':res,'shortened_link':fetch[0].short_url})
155  
156  
157  def home(request):
158  	return render(request,'index.html')
159  ```
160  
161  **models.py**
162  
163  ```from django.db import models
164  
165  # Create your models here.
166  
167  class Links(models.Model):
168  	short_url = models.CharField(max_length = 100)
169  	redirect_url = models.TextField()
170  	tracking_url = models.CharField(max_length = 100)
171  
172  
173  class TrackingData(models.Model):
174  	tracking_url = models.CharField(max_length=100)
175  	short_url = models.CharField(max_length=100)
176  	ip_address = models.TextField()
177  	browser = models.TextField()
178  	os = models.TextField()
179  	device_type = models.TextField()
180  	device = models.TextField()
181  	time = models.TextField()
182  ```
183  
184  **manage.py**
185  ```#!/usr/bin/env python
186  """Django's command-line utility for administrative tasks."""
187  import os
188  import sys
189  
190  
191  def main():
192      """Run administrative tasks."""
193      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'IPLoggerServer.settings')
194      try:
195          from django.core.management import execute_from_command_line
196      except ImportError as exc:
197          raise ImportError(
198              "Couldn't import Django. Are you sure it's installed and "
199              "available on your PYTHONPATH environment variable? Did you "
200              "forget to activate a virtual environment?"
201          ) from exc
202      execute_from_command_line(sys.argv)
203  
204  
205  if __name__ == '__main__':
206      main()
207  ```
208  
209  **apps.py**
210  ```
211  from django.apps import AppConfig
212  
213  
214  class MyserverConfig(AppConfig):
215      name = 'MyServer' 
Posted
Updated 25-Mar-21 22:36pm
v2
Comments
Richard MacCutchan 25-Mar-21 9:56am    
where is line 82?
CHill60 25-Mar-21 11:28am    
You have put a constraint on the data that "something" cannot be NULL but you have not populated that data item before attempting to save

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900