sync from local backup
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
# GetIPDataView Documentation
|
||||
|
||||
## 📄 **File Location**
|
||||
`api/views/GetIPDataView.py`
|
||||
|
||||
### **Overview**
|
||||
Retrieves client IP address information from various HTTP headers and server variables. This view provides comprehensive IP address detection for logging, analytics, and security purposes.
|
||||
|
||||
### **Class Details**
|
||||
|
||||
```python
|
||||
@permission_classes([AllowAny])
|
||||
class GetIPDataView(APIView):
|
||||
def get(self, request):
|
||||
# Implementation...
|
||||
```
|
||||
|
||||
#### **Permissions**
|
||||
- **Access Level**: Public (no authentication required)
|
||||
- **Authentication**: None (`@permission_classes([AllowAny])`)
|
||||
|
||||
### **Method Details**
|
||||
|
||||
#### **GET /api/get-ip-data/**
|
||||
|
||||
##### **Description**
|
||||
Extracts and returns client IP address information from multiple sources including direct connection, proxy headers, and load balancer information.
|
||||
|
||||
##### **Parameters**
|
||||
No parameters required.
|
||||
|
||||
##### **Response Format**
|
||||
|
||||
```json
|
||||
{
|
||||
"ip_info": {
|
||||
"remote_addr": "string",
|
||||
"http_x_forwarded_for": "string",
|
||||
"http_x_real_ip": "string",
|
||||
"http_client_ip": "string",
|
||||
"http_x_forwarded": "string",
|
||||
"http_x_cluster_client_ip": "string",
|
||||
"http_forwarded_for": "string",
|
||||
"http_forwarded": "string"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### **Response Field Descriptions**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `remote_addr` | string | Direct connection IP address |
|
||||
| `http_x_forwarded_for` | string | Comma-separated list of IP addresses from proxy chain |
|
||||
| `http_x_real_ip` | string | Real client IP as seen by reverse proxy |
|
||||
| `http_client_ip` | string | Client IP from custom header |
|
||||
| `http_x_forwarded` | string | Forwarded header value |
|
||||
| `http_x_cluster_client_ip` | string | Cluster client IP header value |
|
||||
| `http_forwarded_for` | string | Standard forwarded for header |
|
||||
| `http_forwarded` | string | Standard forwarded header |
|
||||
|
||||
##### **Usage Examples**
|
||||
|
||||
**Basic Usage:**
|
||||
```bash
|
||||
curl -X GET http://your-api.com/api/get-ip-data/
|
||||
```
|
||||
|
||||
**Expected Response:**
|
||||
```json
|
||||
{
|
||||
"ip_info": {
|
||||
"remote_addr": "192.168.1.100",
|
||||
"http_x_forwarded_for": "203.0.113.50, 198.51.100.25",
|
||||
"http_x_real_ip": "203.0.113.50",
|
||||
"http_client_ip": "",
|
||||
"http_x_forwarded": "",
|
||||
"http_x_cluster_client_ip": "",
|
||||
"http_forwarded_for": "",
|
||||
"http_forwarded": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Empty Response Example:**
|
||||
```json
|
||||
{
|
||||
"ip_info": {
|
||||
"remote_addr": "",
|
||||
"http_x_forwarded_for": "",
|
||||
"http_x_real_ip": "",
|
||||
"http_client_ip": "",
|
||||
"http_x_forwarded": "",
|
||||
"http_x_cluster_client_ip": "",
|
||||
"http_forwarded_for": "",
|
||||
"http_forwarded": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **Error Handling**
|
||||
|
||||
#### **Status Codes**
|
||||
- **200 OK**: Request successful, returns IP information
|
||||
- **No explicit error handling**: Missing headers return empty strings rather than errors
|
||||
|
||||
#### **Behavior with Missing Headers**
|
||||
When a specific IP header is not present:
|
||||
- Returns an empty string (`""`) for that field
|
||||
- Does not raise exceptions or return error responses
|
||||
- All fields are always present in the response
|
||||
|
||||
### **Implementation Details**
|
||||
|
||||
#### **Code Analysis**
|
||||
```python
|
||||
def get(self, request):
|
||||
ip_info = {
|
||||
'remote_addr': request.META.get('REMOTE_ADDR'),
|
||||
'http_x_forwarded_for': request.META.get('HTTP_X_FORWARDED_FOR'),
|
||||
# ... other headers
|
||||
}
|
||||
|
||||
return Response({"ip_info": ip_info}, status=status.HTTP_200_OK)
|
||||
```
|
||||
|
||||
#### **Key Features**
|
||||
- ✅ **Non-intrusive**: No side effects on request processing
|
||||
- ✅ **Comprehensive**: Checks multiple IP source headers
|
||||
- ✅ **Safe**: Gracefully handles missing headers
|
||||
- ✅ **Public access**: No authentication required
|
||||
- ✅ **Lightweight**: Minimal processing overhead
|
||||
|
||||
### **Use Cases**
|
||||
|
||||
#### **Security & Analytics**
|
||||
- Log visitor IP addresses for security monitoring
|
||||
- Track user location patterns
|
||||
- Detect suspicious activity
|
||||
|
||||
#### **Load Balancer Integration**
|
||||
- Extract original client IP behind proxies
|
||||
- Support for cloud platforms (AWS, GCP, Azure)
|
||||
- Works with CDN configurations
|
||||
|
||||
#### **Debugging & Development**
|
||||
- Verify client connection details
|
||||
- Test proxy configurations
|
||||
- Debug network routing issues
|
||||
|
||||
### **⚠️ Important Notes**
|
||||
|
||||
#### **Header Priority**
|
||||
The view checks headers in this order (first found takes precedence):
|
||||
1. `REMOTE_ADDR` (most reliable)
|
||||
2. `X-Forwarded-For`
|
||||
3. `X-Real-IP`
|
||||
4. `Client-Ip`
|
||||
5. `X-Forwarded`
|
||||
6. `X-Cluster-Client-IP`
|
||||
7. `Forwarded-For`
|
||||
8. `Forwarded`
|
||||
|
||||
#### **Security Considerations**
|
||||
- **Trust Level**: Be cautious when trusting forwarded headers in production
|
||||
- **Validation**: Consider validating IP addresses before use
|
||||
- **Privacy**: Ensure compliance with data protection regulations
|
||||
|
||||
#### **Performance Impact**
|
||||
- **Minimal**: Only reads existing request metadata
|
||||
- **No external calls**: Pure local operation
|
||||
- **Constant time**: O(1) complexity regardless of header count
|
||||
|
||||
### **Integration Examples**
|
||||
|
||||
#### **Python Client**
|
||||
```python
|
||||
import requests
|
||||
|
||||
response = requests.get('http://api.example.com/api/get-ip-data/')
|
||||
if response.status_code == 200:
|
||||
ip_data = response.json()
|
||||
print(f"Client IP: {ip_data['ip_info']['remote_addr']}")
|
||||
```
|
||||
|
||||
#### **JavaScript Frontend**
|
||||
```javascript
|
||||
fetch('/api/get-ip-data/')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
console.log('IP Info:', data.ip_info);
|
||||
});
|
||||
```
|
||||
|
||||
#### **Django View Integration**
|
||||
```python
|
||||
from django.http import JsonResponse
|
||||
|
||||
def some_view(request):
|
||||
ip_view = GetIPDataView()
|
||||
ip_response = ip_view.get(request)
|
||||
# Process IP data as needed
|
||||
```
|
||||
|
||||
### **Testing**
|
||||
|
||||
#### **Test Cases**
|
||||
1. **Direct Connection**: Test without any proxy headers
|
||||
2. **Single Proxy**: Test with X-Forwarded-For header
|
||||
3. **Multiple Proxies**: Test with comma-separated IPs
|
||||
4. **Mixed Headers**: Test with various header combinations
|
||||
5. **Missing Headers**: Test with no relevant headers
|
||||
|
||||
#### **Expected Behavior**
|
||||
- Always returns 200 status code
|
||||
- Always includes all 8 IP info fields
|
||||
- Empty strings for unavailable headers
|
||||
- No exceptions or error responses
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: Current Session
|
||||
**Version**: 1.0
|
||||
Reference in New Issue
Block a user