Python 開発 [Django]: 結合検索、JSONP、XSS フィルタリング
1. 簡単な実装
関連ファイル:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^index.html/$',views.index), url(r'^article/(?P<article_type>\d+)-(?P<category>\d+).html/$',views.article) ] url.py
データベース構造:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display:inline-block; padding: 3px 5px; border: 1px solid black; } .condition a.active{ background-color: brown; } </style> </head> <body> <h2>过滤条件</h2> <div> {% if kwargs.article_type == 0 %} <a href="/article/0-{{ kwargs.category }}.html">全部</a> {% else %} <a href="/article/0-{{ kwargs.category }}.html">全部</a> {% endif %} {% for row in article_type %} {% if row.id == kwargs.article_type %} <a href="/article/{{ row.id }}-{{ kwargs.category }}.html">{{ row.caption }}</a> {% else %} <a href="/article/{{ row.id }}-{{ kwargs.category }}.html">{{ row.caption }}</a> {% endif %} {% endfor %} </div> <div> {% if kwargs.category == 0 %} <a href="/article/{{ kwargs.article_type }}-0.html">全部</a> {% else %} <a href="/article/{{ kwargs.article_type }}-0.html">全部</a> {% endif %} {% for row in category %} {% if row.id == kwargs.category %} <a href="/article/{{ kwargs.article_type }}-{{ row.id }}.html">{{ row.caption }}</a> {% else %} <a href="/article/{{ kwargs.article_type }}-{{ row.id }}.html">{{ row.caption }}</a> {% endif %} {% endfor %} </div> <h2>查询结果</h2> <ul> {% for row in articles %} <li>{{ row.id }}-{{ row.title }}------[{{ row.article_type.caption }}]-[{{ row.category.caption }}]</li> {% endfor %} </ul> </body> </html> article.html
処理ファイル:
from django.db import models # Create your models here. class Categoery(models.Model): caption = models.CharField(max_length=16) class ArticleType(models.Model): caption = models.CharField(max_length=16) class Article(models.Model): title = models.CharField(max_length=32) content = models.CharField(max_length=255) category = models.ForeignKey(Categoery) article_type = models.ForeignKey(ArticleType)
注: この関数を実装するのに最も重要なことは、最初に内部のアイデアを明確にすることです。 URL アクセス パスの形式は http://127.0.0.1:8000/article/0-0.html です。最初の 0 は、article_type フィールドを表し、2 番目の 0 は、0 の場合、検索を意味します。このフィールドのすべての情報を確認します。これが成功への最初のステップであり、検索処理でファイルを処理します。2 番目のキー ポイントは、関連する検索用の辞書 search_dict を生成することです。これが 0 の場合は、3 番目のキーをすべて検索することを意味します。ポイントも非常に賢い方法で、パラメーター kwargs をフロントエンドに再度渡します。なんと天才的なことでしょう。
2. 別の試み (メモリチューニングのロード)
ArticleType タイプはブログの固定データなので、後で変更されないように、クエリを高速化するためにデータをメモリにロードできます
from . import models def article(request,*args,**kwargs): search_dict = {} for key,value in kwargs.items(): kwargs[key] = int(value) # 把字符类型转化为int类型 方便前端做if a == b 这样的比较 if value !='0': search_dict[key] = value articles = models.Article.objects.filter(**search_dict) # 字典为空时表示搜索所有 article_type = models.ArticleType.objects.all() category = models.Categoery.objects.all() return render(request,'article.html',{'articles':articles, 'article_type':article_type, 'category':category , 'kwargs':kwargs})
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display:inline-block; padding: 3px 5px; border: 1px solid black; } .condition a.active{ background-color: brown; } </style> </head> <body> <h2>过滤条件</h2> <div> {% if kwargs.article_type_id == 0 %} <a href="/article/0-{{ kwargs.category_id }}.html">全部</a> {% else %} <a href="/article/0-{{ kwargs.category_id }}.html">全部</a> {% endif %} {% for row in article_type%} {% if row.0 == kwargs.article_type_id %} <a href="/article/{{ row.0 }}-{{ kwargs.category_id }}.html">{{ row.1 }}</a> {% else %} <a href="/article/{{ row.0 }}-{{ kwargs.category_id }}.html">{{ row.1 }}</a> {% endif %} {% endfor %} </div> <div> {% if kwargs.category_id == 0 %} <a href="/article/{{ kwargs.article_type_id }}-0.html">全部</a> {% else %} <a href="/article/{{ kwargs.article_type_id }}-0.html">全部</a> {% endif %} {% for row in category %} {% if row.id == kwargs.category_id %} <a href="/article/{{ kwargs.article_type_id }}-{{ row.id }}.html">{{ row.caption }}</a> {% else %} <a href="/article/{{ kwargs.article_type_id }}-{{ row.id }}.html">{{ row.caption }}</a> {% endif %} {% endfor %} </div> <h2>查询结果</h2> <ul> {% for row in articles %} <li>{{ row.id }}-{{ row.title }}------[{{ row.article_type }}]-[{{ row.category.caption }}]</li> {% endfor %} </ul> </body> </html> article.html
データベース。ファイル:
from django.shortcuts import render from django.shortcuts import HttpResponse # Create your views here. def index(request): return HttpResponse('Ok') from . import models def article(request,*args,**kwargs): search_dict = {} for key,value in kwargs.items(): kwargs[key] = int(value) # 把字符类型转化为int类型 方便前端做if a == b 这样的比较 if value !='0': search_dict[key] = value print(kwargs) articles = models.Article.objects.filter(**search_dict) # 字典为空时表示搜索所有 article_type = models.Article.type_choice print(article_type) category = models.Categoery.objects.all() return render(request,'article.html',{'articles':articles, 'article_type':article_type, 'category':category , 'kwargs':kwargs}) 处理文件.py
3. simple_tag を使用してコードを最適化します
関連ファイル:
from django.db import models # Create your models here. class Categoery(models.Model): caption = models.CharField(max_length=16) # class ArticleType(models.Model): # caption = models.CharField(max_length=16) class Article(models.Model): title = models.CharField(max_length=32) content = models.CharField(max_length=255) category = models.ForeignKey(Categoery) # article_type = models.ForeignKey(ArticleType) type_choice = [ (1,'Python'), (2,'Linux'), (3,'大数据'), (4,'架构'), ] article_type_id = models.IntegerField(choices=type_choice)
from django.db import models # Create your models here. class Categoery(models.Model): caption = models.CharField(max_length=16) class ArticleType(models.Model): caption = models.CharField(max_length=16) class Article(models.Model): title = models.CharField(max_length=32) content = models.CharField(max_length=255) category = models.ForeignKey(Categoery) article_type = models.ForeignKey(ArticleType) # type_choice = [ # (1,'Python'), # (2,'Linux'), # (3,'大数据'), # (4,'架构'), # ] # article_type_id = models.IntegerField(choices=type_choice) 数据库文件.py
from django.shortcuts import render from django.shortcuts import HttpResponse # Create your views here. def index(request): return HttpResponse('Ok') from . import models def article(request, *args, **kwargs): search_dict = {} for key, value in kwargs.items(): kwargs[key] = int(value) # 把字符类型转化为int类型 方便前端做if a == b 这样的比较 if value != '0': search_dict[key] = value articles = models.Article.objects.filter(**search_dict) # 字典为空时表示搜索所有 article_type = models.ArticleType.objects.all() print(article_type) category = models.Categoery.objects.all() return render(request, 'article.html', {'articles': articles, 'article_type': article_type, 'category': category, 'kwargs': kwargs}) 处理文件.py
templatetags ディレクトリを作成し、そのディレクトリに filter.py ファイルを作成します:
{% load filter %} <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display:inline-block; padding: 3px 5px; border: 1px solid black; } .condition a.active{ background-color: brown; } </style> </head> <body> <h2>过滤条件</h2> <div> {% filter_all kwargs 'article_type'%} {% filter_single article_type kwargs 'article_type'%} </div> <div> {% filter_all kwargs 'category'%} {% filter_single category kwargs 'category'%} </div> <h2>查询结果</h2> <ul> {% for row in articles %} <li>{{ row.id }}-{{ row.title }}------[{{ row.article_type.caption }}]-[{{ row.category.caption }}]</li> {% endfor %} </ul> </body> </html> article.html
HTML ファイルのメインコンテンツ:
from django import template from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag def filter_all(kwargs,type_str): print(type_str) if type_str == 'article_type': if kwargs['article_type'] == 0: tmp = '<a href = "/article/0-%s.html" class ="active" > 全部 </a>'%(kwargs['category']) else: tmp = '<a href = "/article/0-%s.html"> 全部 </a>'%(kwargs['category']) elif type_str == 'category': if kwargs['category'] == 0: tmp = '<a href = "/article/%s-0.html" class ="active" > 全部 </a>' % (kwargs['article_type']) else: tmp = '<a href = "/article/%s-0.html"> 全部 </a>' % (kwargs['article_type']) return mark_safe(tmp) @register.simple_tag() def filter_single(type_obj,kwargs,type_str): print(type_str) tmp = '' if type_str == 'article_type': for row in type_obj: if row.id == kwargs['article_type']: tag = '<a class="active" href="/article/%s-%s.html">%s</a>\n'%(row.id,kwargs['category'],row.caption) else: tag = '<a href="/article/%s-%s.html">%s</a>\n' % (row.id, kwargs['category'],row.caption) tmp +=tag elif type_str == 'category': for row in type_obj: if row.id == kwargs['category']: tag = '<a class="active" href="/article/%s-%s.html">%s</a>\n' % (kwargs['article_type'],row.id, row.caption) else: tag = '<a href="/article/%s-%s.html">%s</a>\n' % (kwargs['article_type'], row.id, row.caption) tmp += tag return mark_safe(tmp)
JSONP
JSONP (JSON with Padding) は、主流ブラウザによるクロスドメイン データ アクセスの問題を解決するために使用できる JSON の「使用パターン」です。同一オリジン ポリシーにより、一般に、server1.example.com にある Web ページは、HTML の <script> 要素を除き、server1.example.com 以外のサーバーと通信できません。 <script> 要素のこのオープン ポリシーを使用すると、Web ページは他のソースから動的に生成された JSON データを取得できます。この使用パターンは JSONP と呼ばれます。 JSONP でキャプチャされたデータは JSON ではなく、JSON パーサーで解析されるのではなく、JavaScript インタープリターで実行される任意の JavaScript です。 </script>
原則:
- スクリプトタグを作成します
- src = リモートアドレス
- 返されるデータは js 形式である必要があります
- GET リクエストのみを送信できます
1. 同一生成元ポリシーとは何ですか?
処理ファイル:
{% load filter %} <body> <h2>过滤条件</h2> <div class="condition"> {% filter_all kwargs 'article_type'%} {% filter_single article_type kwargs 'article_type'%} </div> <div class="condition"> {% filter_all kwargs 'category'%} {% filter_single category kwargs 'category'%} </div> <h2>查询结果</h2> <ul> {% for row in articles %} <li>{{ row.id }}-{{ row.title }}------[{{ row.article_type.caption }}]-[{{ row.category.caption }}]</li> {% endfor %} </ul> </body>
HTML ファイル:
import requests def jsonp(request): # 获取url信息 response = requests.get('http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301') response.encoding = 'utf-8' # 进行编码 return render(request,'jsonp.html',{'result':response.text}) # response.text 请求内容
注: js をクリックして結果を直接取得すると、ブラウザは http://127.0.0.1:8000 から送信された情報のみを受け入れるため、次のエラー メッセージが表示されます。 、天気予報 Web サイトから送信された情報が直接ブロックされます。これを解決する方法はありますか。
<body> <h1>后台获取的结果</h1> {{ result }} <h1>js直接获取结果</h1> <input type="button" value="获取数据" onclick="getContent();" /> <div id="container"></div> <script src="/static/jquery-1.8.2.js"></script> <script> function getContent() { var xhr = new XMLHttpRequest(); // 创建对象 xhr.open('GET', 'http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301'); // GET方式打开 xhr.onreadystatechange = function () { // 收到返回值时执行 console.log(xhr.responseText); }; xhr.send() // 发送 } </script> </body>
2. scriptタグのsrc属性を上手に使おう
scriptタグは同一オリジンポリシーの影響を受けない
処理ファイル:
XMLHttpRequest cannot load http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8000' is therefore not allowed access.
HTMLファイル:
import requests def jsonp(request): # 获取url信息 response = requests.get('http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301') response.encoding = 'utf-8' # 进行编码 return render(request,'jsonp.html',{'result':response.text}) # response.text 请求内容 def jsonp_api(request): return HttpResponse('alert(123)')
注意:便宜上js をリクエストするとき、リクエストはまだ現在のプログラム URL に対するものです。上記のコードを実行すると、魔法のような状況が発生し、スクリプトが情報を正常に取得したことを示す 123 の情報が表示されます
3. フロントエンドとバックエンドを少し変更して、使用法をより動的にします
処理ファイル:
<body> <h1>后台获取的结果</h1> {{ result }} <h1>js直接获取结果</h1> <input type="button" value="获取数据" onclick="getContent();" /> <div id="container"></div> <script> function getContent() { var tag = document.createElement('script'); tag.src = '/jsonp_api.html'; document.head.appendChild(tag); // document.head.removeChild(tag); } </script> </body>
HTML ファイル:
def jsonp(request): return render(request,'jsonp.html') # response.text 请求内容 def jsonp_api(request): func = request.GET.get('callback') # 获取用户callback参数 content = '%s(10000)'%func # 执行func(10000)函数 return HttpResponse(content)
注: js リクエストを送信するときは、コールバック パラメーターを取得し、それに対応するメソッドを定義します。バックグラウンドはこのメソッドにデータを渡して実行します。印刷やポップアップ ボックスの場合は、ユーザー自身のニーズに応じて、jsonp の実装プロセスが上記のコードの実装になります。 4. サンプルアプリケーション + ajax
処理ファイル:
<body> <h1>后台获取的结果</h1> {{ result }} <h1>js直接获取结果</h1> <input type="button" value="获取数据" onclick="getContent();" /> <div id="container"></div> <script> function getContent() { var tag = document.createElement('script'); tag.src = '/jsonp_api.html?callback=list'; // 自定义callback参数,与后台达成默契 document.head.appendChild(tag); // document.head.removeChild(tag); } function list(arg){ // 自定义函数与callback=list相对应 alert(arg); } </script> </body>
HTML ファイル:
import requests def jsonp(request): response = requests.get('http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403') response.encoding = 'utf-8' # 进行编码 return render(request, 'jsonp.html', {'result': response.text}) # response.text 请求内容
<body> <h1>后台获取的结果</h1> {{ result }} <h1>js直接获取结果</h1> <input type="button" value="获取数据" onclick="getContent();" /> <div id="container"></div> <script src="/static/jquery-1.8.2.js"></script> <script> function getContent() { $.ajax({ url: 'http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403', type: 'POST', dataType: 'jsonp', // 即使写的type是POST也是按照GET请求发送 jsonp: 'callback', jsonpCallback: 'list' }); } function list(arg){ // 自定义函数与callback=list相对应 console.log(arg); var data = arg['data']; for(k in data){ var tr = document.createElement('td'); var week = data[k]['week']; var list = data[k]['list']; tr.textContent =week document.body.appendChild(tr); console.log(week); for(i in list){ var name = list[i]['name']; console.log(name) }}} </script> </body>
注: 実装済み 処理はNo.3さんが書いたコードと全く同じです。スクリプトも作成して削除しています
詳細 Python 開発 [Django]: 結合検索、JSONP、XSS フィルタリング関連記事、PHP 中国語 Web サイトにご注意ください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Python 開発経験の共有: バージョン管理とリリース管理を実行する方法 はじめに: Python 開発プロセスにおいて、バージョン管理とリリース管理は非常に重要なリンクです。バージョン管理を通じて、コードの変更を簡単に追跡し、開発で共同作業し、競合を解決することができます。また、リリース管理は、コードの展開、テスト、リリースのプロセスを整理して、コードの品質と安定性を確保するのに役立ちます。この記事では、バージョン管理とリリース管理の 2 つの側面から Python 開発の経験と実践を共有します。 1. バージョン管理 バージョン管理

高級プログラミング言語である Python は、学習しやすく、使いやすく、開発効率が高いという利点があり、開発者の間でますます人気が高まっています。ただし、ガベージ コレクション メカニズムの実装方法が原因で、Python は大量のメモリを処理するときにメモリ リークが発生する傾向があります。この記事では、よくあるメモリリーク問題、問題の原因、メモリリークを回避する方法の3つの側面からPython開発時に注意すべきことを紹介します。 1. 一般的なメモリ リークの問題: メモリ リークとは、動作中にプログラムによって割り当てられたメモリ空間を解放できないことを指します。

Python は、さまざまな分野のソフトウェア開発で広く使用されている強力で柔軟なプログラミング言語です。 Python 開発プロセスでは、オブジェクト指向プログラミング (OOP) の原則を習得して適用することが非常に重要です。この記事では、開発者がオブジェクト指向プログラミングの原則をよりよく理解して適用できるように、Python 開発に関する重要な提案をいくつか紹介します。まず、オブジェクト指向プログラミングの中心的な考え方は、問題を一連のオブジェクトに分割し、

Python 開発経験の共有: コード レビューと品質保証の実施方法 はじめに: ソフトウェア開発プロセスにおいて、コード レビューと品質保証は重要なリンクです。優れたコードレビューにより、コードの品質が向上し、エラーや欠陥が減少し、プログラムの保守性と拡張性が向上します。この記事では、Python 開発におけるコードレビューと品質保証の経験を次の側面から共有します。 1. コード レビュー仕様の作成 コード レビューは、コードの包括的な検査と評価を必要とする体系的な活動です。コードレビューを標準化するには

pip 国内ソース インストール チュートリアル: Python 開発をよりスムーズにするには、特定のコード サンプルが必要です。Python 開発では、サードパーティ ライブラリを管理するために pip を使用するのが非常に一般的です。ただし、よく知られている理由により、公式 pip ソースを直接使用すると、ダウンロード速度が遅い、接続できないなどの問題が発生することがあります。この問題を解決するために、Alibaba Cloud、Tencent Cloud、Douban などの優れた国内の pip ソースが中国で登場しました。これらの国産ソースを使用すると、ダウンロード速度が大幅に向上し、Python 開発の効率が向上します。

Python 開発は、さまざまな種類のアプリケーションの開発によく使用される、シンプルかつ強力なプログラミング言語です。ただし、初心者にとっては、プロジェクトの構造やモジュールの分割にいくつかの課題があるかもしれません。適切なプロジェクト構造とモジュール分割は、コードの保守性と拡張性を向上させるだけでなく、チーム開発の効率も向上します。この記事では、Python プロジェクトの構造とモジュール分割を適切に計画するのに役立ついくつかの提案を共有します。まず第一に、優れたプロジェクト構造では、プロジェクトの目的を明確に示すことができなければなりません。

ゼロから始めて、Python 開発をより効率的にするために pip の国産ソースを構成する方法を段階的に説明します。Python の開発プロセスでは、pip を使用してサードパーティ ライブラリを管理することがよくあります。ただし、国内のネットワーク環境の問題により、デフォルトの pip ソースを使用すると、ダウンロード速度が遅くなったり、接続できなくなったりすることがよくあります。 Python開発を効率化するためには、国産ソースを構築する必要があります。それでは、pip 国内ソースを段階的に設定してみましょう。まず、pip を見つける必要があります

Python 開発経験のまとめ: コードのセキュリティと防御を向上させる方法 インターネットの発展に伴い、コードのセキュリティと防御はますます注目を集めています。特に、Python は動的言語として広く使用されているため、さまざまな潜在的なリスクにも直面しています。この記事では、Python 開発者に役立つことを願って、Python コードのセキュリティと防御を向上させるいくつかの方法をまとめます。入力検証の適切な使用 開発プロセス中に、ユーザー入力に悪意のあるコードが含まれる可能性があります。このような事態が起こらないようにするために、開発者は次のことを行う必要があります。
