質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4761閲覧

django viewsで処理したcontextの値をテンプレート以外で使いたい。

grilled_python

総合スコア237

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/22 14:56

編集2018/06/23 05:30

下記のコードで3つの変数がテンプレートで使用できるようになりました。
context['search_keywords']
context['search_count']
context['google_results']
その内google_resultsにはURLのリストが入っています。

そのリストを他のファイルで受け取りたいのですがうまくいきません。
contextは他のファイルからはどのようにして参照すればいいでしょうか?
同じプロジェクト内のdjangoではないファイルです。

views.py

python

1from django.shortcuts import render 2from django.views.generic import TemplateView 3from bs4 import BeautifulSoup 4import requests 5import re 6from googlesearch import search 7 8class IndexView(TemplateView): 9 10 template_name = 'main/index.html' 11 12 def get_context_data(self, **kwargs): 13 context = super().get_context_data(**kwargs) # はじめに継承元のメソッドを呼び出す 14 context['search_keywords'] = self.request.GET.get('search_keywords') 15 context['search_count'] = self.request.GET.get('search_count') 16 context['google_results'] = self.google_search(self.request.GET.get('search_keywords'), self.request.GET.get('search_count')) 17 return context 18 19 20 def google_search(self,query,page): 21 """1ページ10件、stop=2で20件の検索結果を返す""" 22 results = search(query, lang='jp', stop=int(page), pause=2.0, user_agent='Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25') 23 g =[] 24 for x in results: 25 g.append(x) 26 return g

受け取りたいファイル
aficrawl2.py
こちらはスクレイピング用のファイルで同じプロジェクト内にあります。
こちらでリストのURLを受け取りたいです。。

python

1# -*- coding: utf-8 -*- 2import scrapy 3 4 5class BlogSpider(scrapy.Spider): 6 name = 'blogspider' # Spider の 名前。 # クロール を 開始 する URL の リスト。 7 start_urls = ['ここにリストを受け取りたい'] 8 9 def parse(self, response): 10 """ トップページ から カテゴリ ページ への リンク を 抜き出し て たどる。 """ 11 i = {} 12 i['title'] = response.xpath('//title/text()').extract_first() 13 i['description'] = response.xpath('/html/head/meta[@name="description"]/@content').extract_first() 14 i['h1'] = response.xpath('//h1/text()').extract() 15 i['h2'] = response.xpath('//h2/text()').extract() 16 i['h3'] = response.xpath('//h3/text()').extract() 17 i['h4'] = response.xpath('//h4/text()').extract() 18 i['h5'] = response.xpath('//h5/text()').extract() 19 i['h6'] = response.xpath('//h6/text()').extract() 20 21 yield i

python

1from afiscrapy.main.views import IndexView 2 3============================ 4if __name__=='__main__': 5 results = IndexView.get_context_data() 6 start_urls = results['google_results'] 7 print(results['google_results']) 8 9

IndexViewをインポートしてきてget_context_data()を呼び出せば、
context['google_results']を扱えるかと思いましたが、

ModuleNotFoundError: No module named 'afiscrapy'
モジュールが見つかりません。

ディレクトリツリー
ディレクトリツリー

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論からいうとそのまま利用することは不可能です。

IndexView は あなたがブラウザで urlを実行して、画面に表示されるまでの、一連の処理です。 contextはその一連の処理の中で、テンプレートを表示する時にだけ使える変数です。

なのでそれを別スクリプトからそのまま使うのは不可能です。やるとするのであれば、google_searchのメソッドを完全に関数として切り出して別のファイルとして保存して、それを IndexView、 BlogSpiderの両方で利用するということをであれば可能だと思います。

投稿2018/07/21 13:43

編集2018/07/31 03:19
tell_k

総合スコア2120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問