জ্যাঙ্গোর সমস্ত অনুরোধ শিরোনাম কীভাবে পাব?


107

আমার সমস্ত জ্যাঙ্গো অনুরোধ শিরোনাম পাওয়া দরকার। আমি যা পড়েছি তা থেকে, জ্যাঙ্গো কেবলমাত্র request.METAঅন্যান্য ডেটা সহ প্রচুর পরিমাণে ভেরিয়েবলের মধ্যে ফেলে দেয় । ক্লায়েন্টটি আমার জ্যাঙ্গো অ্যাপ্লিকেশনটিতে পাঠানো সমস্ত শিরোনাম পাওয়ার সর্বোত্তম উপায় কী হবে ?

আমি একটি httplibঅনুরোধ তৈরি করতে এগুলি ব্যবহার করছি ।

উত্তর:


139

ডকুমেন্টেশন অনুসারে request.METAএকটি "স্ট্যান্ডার্ড পাইথন অভিধান যা সমস্ত উপলব্ধ HTTP শিরোনাম রয়েছে" containing আপনি যদি সমস্ত শিরোনাম পেতে চান তবে আপনি কেবল অভিধানের মাধ্যমে পুনরাবৃত্তি করতে পারেন।

আপনার কোডের কোন অংশটি এটি করা আপনার সঠিক প্রয়োজনের উপর নির্ভর করে। অ্যানিপ্লেস যাতে অ্যাক্সেস রয়েছে তা করা requestউচিত।

হালনাগাদ

আমার এটি মিডলওয়্যার ক্লাসে অ্যাক্সেস করা দরকার তবে আমি যখন এটির পুনরাবৃত্তি করি তখন আমি এইচটিটিপি শিরোনাম বাদ দিয়ে অনেক মান পাই values

ডকুমেন্টেশন থেকে:

ব্যতীত CONTENT_LENGTHএবং CONTENT_TYPE, যেমন দেওয়া উপরোক্ত কোন HTTPঅনুরোধে হেডার রূপান্তরিত হয় METAকি, বড় হাতের থেকে সমস্ত অক্ষর রূপান্তর আন্ডারস্কোর সঙ্গে কোনো হাইফেন প্রতিস্থাপন এবং দ্বারা যোগ করার সময় একটি HTTP_নাম উপসর্গ

(সামনে জোর দাও)

HTTPশিরোনামগুলি একা পেতে, উপসর্গযুক্ত কী দ্বারা কেবল ফিল্টার করুন HTTP_

আপডেট 2

আপনি কী আমাকে অনুরোধ থেকে সমস্ত কীগুলি ফিল্টার করে শিরোনামের অভিধান তৈরি করতে পারছেন তা আমাকে দেখাতে পারেন M মেটা ভেরিয়েবল যা HTTP_ দিয়ে শুরু হয় এবং শীর্ষস্থানীয় HTTP_ অংশটি সরিয়ে দেয়।

অবশ্যই। এটি করার একটি উপায় এখানে।

import re
regex = re.compile('^HTTP_')
dict((regex.sub('', header), value) for (header, value) 
       in request.META.items() if header.startswith('HTTP_'))

আমার এটি মিডলওয়্যার ক্লাসে অ্যাক্সেস করা দরকার তবে আমি যখন এটির পুনরাবৃত্তি করি তখন আমি এইচটিটিপি শিরোনাম বাদ দিয়ে প্রচুর মান পাই।
মৃডাং আগারওয়ালা

ধন্যবাদ মনোজ। কৌতূহলের বাইরে - আপনি কী আমাকে দেখিয়ে দিতে পারেন যে আমি request.METAভেরিয়েবলের সমস্ত কীগুলি ফিল্টার করে যা শিরোনামের একটি অভিধান তৈরি করতে পারি যা একটি দিয়ে শুরু হয় HTTP_এবং অগ্রণী HTTP_অংশটি বের করে দেয় । ল্যাম্বদা ফাংশনের মাধ্যমে এটি কি সম্ভব? (আমি মনে করি তাদের ল্যাম্বডা ফাংশন বলা হয়) আমি এটি জিজ্ঞাসা করছি কারণ আমি সম্ভবত তাদের উপর প্রথমবার পুনরাবৃত্তি করে দীর্ঘ পথটি চালিয়ে যাব, তারপরে এটি কোনওটি দিয়ে শুরু হয় কিনা তা পরীক্ষা HTTP_করে এবং এটি নতুন অভিধানে যুক্ত করে। আবার ধন্যবাদ.
মৃডাং আগারওয়ালা

ধন্যবাদ আবার মনোজ। আমি lstrip('HTTP_')রেগেক্সের পরিবর্তে এটি ব্যবহার করতে কিছুটা সংশোধন করেছি । :)
মৃডাং আগরওয়ালা

3
@ মৃডাঙ্গ আগরওয়ালা: lstripআপনি যা করতে বলছেন আসলে তা করবেন না। lstripআপনার দেওয়া স্ট্রিংয়ের যে কোনও অক্ষরের সাথে মেলে এমন সমস্ত নেতৃস্থানীয় অক্ষরগুলি বের করে দেবে, সুতরাং আপনার যদি একটি শিরোনাম থাকে তবে "HTTP_TOKEN_ID"এটি ফেরত দেবে "OKEN_ID", কারণ "T"শুরুতে "TOKEN"স্ট্রিংয়ের একটি অক্ষর মিলে গিয়ে lstripে চলে গেছে। এটি করার উপায় prefix = 'HTTP_'; header = header[len(prefix):]
jcdyer

2
জ্যাঙ্গো ২.২ সমর্থন করেছে HttpRequest.headers
ড্যাকালস্কি

30

জ্যাঙ্গো ২.২ থেকে শুরু করে আপনি request.headersHTTP শিরোনাম অ্যাক্সেস করতে ব্যবহার করতে পারেন । HttpRequest.headersনথি থেকে :

অনুরোধ থেকে একটি সংবেদনশীল, ডিক-এর মতো অবজেক্ট যা সমস্ত এইচটিটিপি-প্রিফিক্সড শিরোনাম (প্লাস কনটেন্ট-দৈর্ঘ্য এবং সামগ্রী-প্রকার) অ্যাক্সেস সরবরাহ করে।

প্রতিটি শিরোনামের নাম শিরোনাম-আবরণ দিয়ে স্টাইলাইজ করা হয় (উদাহরণস্বরূপ ব্যবহারকারী-এজেন্ট) যখন এটি প্রদর্শিত হয়। সংবেদনশীলভাবে আপনি শিরোনাম অ্যাক্সেস করতে পারেন:

>>> request.headers
{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}

>>> 'User-Agent' in request.headers
True
>>> 'user-agent' in request.headers
True

>>> request.headers['User-Agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers['user-agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

>>> request.headers.get('User-Agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('user-agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

সমস্ত শিরোনাম পেতে, আপনি ব্যবহার করতে পারেন request.headers.keys()বা request.headers.items()


17

এটি করার আরেকটি উপায় এটি উপরের মনোজ গোবিন্দনের জবাবের সাথে খুব মিল :

import re
regex_http_          = re.compile(r'^HTTP_.+$')
regex_content_type   = re.compile(r'^CONTENT_TYPE$')
regex_content_length = re.compile(r'^CONTENT_LENGTH$')

request_headers = {}
for header in request.META:
    if regex_http_.match(header) or regex_content_type.match(header) or regex_content_length.match(header):
        request_headers[header] = request.META[header]

এটিগুলি সহ CONTENT_TYPECONTENT_LENGTHঅনুরোধ শিরোনামগুলিও দখল করবে HTTP_request_headers['some_key]== request.META['some_key']

যদি আপনাকে নির্দিষ্ট শিরোনাম অন্তর্ভুক্ত / বাদ দিতে হয় তবে সেই অনুযায়ী সংশোধন করুন। জ্যাঙ্গো এখানে একগুচ্ছ তালিকাবদ্ধ করে তবে সমস্ত এখানে নয়: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

অনুরোধ শিরোনামগুলির জন্য জ্যাঙ্গোর অ্যালগরিদম:

  1. হাইফেনকে -আন্ডারস্কোর দিয়ে প্রতিস্থাপন করুন_
  2. UPPERCASE এ রূপান্তর করুন।
  3. HTTP_আসল অনুরোধে সমস্ত শিরোনামকে প্রস্তুত করুন , ব্যতীত CONTENT_TYPEএবং CONTENT_LENGTH

প্রতিটি শিরোনামের মানগুলি সংশোধিত হওয়া উচিত।


5
re.compile(r'^(HTTP_.+|CONTENT_TYPE|CONTENT_LENGTH)$')
এগুলি সমস্তই


3

আমি মনে করি না কেবলমাত্র এইচটিটিপি শিরোনাম পাওয়ার কোনও সহজ উপায় আছে। আপনার যা প্রয়োজন তা পাওয়ার জন্য আপনাকে অনুরোধের মাধ্যমে পুনরাবৃত্তি করতে হবে M মিতা ডিক্ট।

জ্যাঙ্গো-ডিবাগ-টুলবার শিরোনামের তথ্য প্রদর্শন করতে একই পন্থা গ্রহণ করে। শিরোনামের তথ্য পুনরুদ্ধারের জন্য দায়ী এই ফাইলটি একবার দেখুন ।


1

আপনি যদি অনুরোধ শিরোনাম থেকে ক্লায়েন্ট কী পেতে চান তবে আপনি নিম্নলিখিতগুলি চেষ্টা করতে পারেন:

from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
from apps.authentication.models import CerebroAuth

class CerebroAuthentication(BaseAuthentication):
def authenticate(self, request):
    client_id = request.META.get('HTTP_AUTHORIZATION')
    if not client_id:
        raise exceptions.AuthenticationFailed('Client key not provided')
    client_id = client_id.split()
    if len(client_id) == 1 or len(client_id) > 2:
        msg = ('Invalid secrer key header. No credentials provided.')
        raise exceptions.AuthenticationFailed(msg)
    try:
        client = CerebroAuth.objects.get(client_id=client_id[1])
    except CerebroAuth.DoesNotExist:
        raise exceptions.AuthenticationFailed('No such client')
    return (client, None)

1

এটির মূল্য হ'ল, এটি প্রতীয়মান হয় যে আগত এইচটিটিপি অনুরোধটি অন্য একটি এইচটিটিপি অনুরোধ গঠনের জন্য ব্যবহার করা আপনার উদ্দেশ্য। গেটওয়ের মতো বাছাই করুন। একটি দুর্দান্ত মডিউল রয়েছে জাঙ্গো-রেভপ্রক্সি যা ঠিক এটি সম্পাদন করে।

আপনি যা করতে চেষ্টা করছেন তা কীভাবে সম্পাদন করতে হবে উত্সটি একটি দুর্দান্ত রেফারেন্স।


0
<b>request.META</b><br>
{% for k_meta, v_meta in request.META.items %}
  <code>{{ k_meta }}</code> : {{ v_meta }} <br>
{% endfor %}

0

কেবলমাত্র আপনি ব্যবহার করতে পারেন HttpRequest.headers থেকে জ্যাঙ্গো 2.2 অনওয়ার্ড। অনুরোধ এবং প্রতিক্রিয়া অবজেক্টস বিভাগের অধীনে সরকারী জ্যাঙ্গো ডকুমেন্টেশন থেকে নিম্নলিখিত উদাহরণটি সরাসরি নেওয়া হয়েছে ।

>>> request.headers
{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}

>>> 'User-Agent' in request.headers
True
>>> 'user-agent' in request.headers
True

>>> request.headers['User-Agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers['user-agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

>>> request.headers.get('User-Agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('user-agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.