0% found this document useful (0 votes)
23 views5 pages

From Flask Import Flask, Render - Tem

This document outlines a Flask web application that provides news articles based on user preferences, including categories, countries, and languages. It includes user authentication features such as signup, login, and profile management, along with functionality to fetch news from an external API. The application utilizes in-memory storage for user data and supports session management for user preferences and settings.

Uploaded by

dhumalyash578
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
23 views5 pages

From Flask Import Flask, Render - Tem

This document outlines a Flask web application that provides news articles based on user preferences, including categories, countries, and languages. It includes user authentication features such as signup, login, and profile management, along with functionality to fetch news from an external API. The application utilizes in-memory storage for user data and supports session management for user preferences and settings.

Uploaded by

dhumalyash578
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

from flask import Flask, render_template, request, jsonify, flash, redirect,

url_for, session
from datetime import datetime
import requests

app = Flask(__name__)
app.secret_key = 'my_very_unsafe_secret_key_for_testing'

# Dummy in-memory storage for user data


users = {}
preferences_data = {}

CATEGORIES = ["General", "Technology", "Health", "Sports", "Entertainment",


"Science"]
COUNTRIES = ["India", "United States", "United Kingdom", "Australia", "Canada"]
LANGUAGES = {
"India": ["English", "Hindi"],
"United States": ["English"],
"United Kingdom": ["English"],
"Australia": ["English"],
"Canada": ["English"]
}

SOURCE_MAP = {
'India': {
'English': ["Times of India", "Hindustan Times", "The Hindu", "India
Today"],
'Hindi': ["Dainik Jagran", "Amar Ujala"]
},
'United States': {
'English': ["CNN", "The New York Times", "Washington Post", "USA Today"]
},
'United Kingdom': {
'English': ["BBC News", "The Guardian", "The Independent"]
}
}

API_KEY = '308d9dcd0b0d9b0428350da357a07f53'
GNEWS_API_URL = 'https://gnews.io/api/v4/top-headlines'
GNEWS_SEARCH_URL = 'https://gnews.io/api/v4/search'

@app.route('/')
def index():
selected_category = request.args.get('category', 'General')
selected_country = request.args.get('country', 'India')
selected_language = request.args.get('language', 'English')
selected_source = request.args.get('source', '')
search_query = request.args.get('q', '')

sources = SOURCE_MAP.get(selected_country, {}).get(selected_language, [])

user_email = session.get('user_email')
if user_email:
user = users.get(user_email, {})
user_preferences = user.get('preferences', [selected_category])
user_languages = user.get('languages', [selected_language])
user_sources = user.get('news_sources', [selected_source])
else:
user_preferences = [selected_category]
user_languages = [selected_language]
user_sources = [selected_source]

if search_query:
articles = search_news(search_query, selected_language)
else:
category_to_fetch = user_preferences[0] if user_preferences else
selected_category
language_to_fetch = user_languages[0] if user_languages else
selected_language
source_to_fetch = user_sources[0] if user_sources else None
articles = fetch_news(category_to_fetch, selected_country,
language_to_fetch, source_to_fetch)

return render_template(
'index.html',
articles=articles,
categories=CATEGORIES,
countries=COUNTRIES,
languages=LANGUAGES,
sources=sources,
selected_category=selected_category,
selected_country=selected_country,
selected_language=selected_language,
selected_source=selected_source,
search_query=search_query
)

def fetch_news(category, country, language, source=None):


params = {
'category': category.lower(),
'country': country.lower(),
'lang': language[:2].lower(),
'token': API_KEY
}
if source:
params['source'] = source.lower()

response = requests.get(GNEWS_API_URL, params=params)


return process_response(response)

@app.route('/search', methods=['GET'])
def search():
query = request.args.get('query')
language = request.args.get('language')
if query and language:
# Process the search logic
return render_template('index.html', query=query, language=language)
else:
return redirect(url_for('index'))

def search_news(query, language):


params = {
'q': query,
'lang': language[:2].lower(),
'token': API_KEY
}
response = requests.get(GNEWS_SEARCH_URL, params=params)
return process_response(response)

def process_response(response):
if response.status_code == 200:
articles = response.json().get('articles', [])
for article in articles:
if article.get('publishedAt'):
utc_time = datetime.strptime(article['publishedAt'], '%Y-%m-%dT%H:
%M:%SZ')
article['formatted_date'] = utc_time.strftime('%d/%m/%Y %I:%M %p')
article['summary'] = article.get('description', 'No summary
available.')
return articles
return []

@app.route('/signup', methods=['GET', 'POST'])


def signup():
if request.method == 'POST':
email = request.form.get('email')
password = request.form.get('password')
name = request.form.get('name')

preferences = request.form.getlist('preferences')
languages = request.form.getlist('languages')

if email in users:
flash('Email already registered! Please log in.', 'error')
return redirect(url_for('login'))

users[email] = {
'email': email,
'password': password,
'name': name,
'preferences': preferences,
'languages': languages,
'news_sources': []
}

# Set session and flash message after successful signup


session['user_email'] = email
flash('Sign up successful! Please select your preferences.', 'success')

# Redirect to preferences page after successful signup


return redirect(url_for('preferences'))

return render_template('signup.html')

@app.route('/preferences', methods=['GET', 'POST'])


def preferences():
if request.method == 'POST':
selected_preferences = request.form.getlist('preferences')
selected_news_sources = request.form.getlist('news_sources')
selected_languages = request.form.getlist('languages')
user_email = session.get('user_email')

if user_email in users:
user = users[user_email]
user['preferences'] = selected_preferences
user['news_sources'] = selected_news_sources
user['languages'] = selected_languages

flash('Preferences saved successfully!', 'success')


return redirect(url_for('index'))

# Fetch user details from session if available


user_email = session.get('user_email')
user = None
if user_email in users:
user = users[user_email]

return render_template('preferences.html', user=user)

@app.route('/login', methods=['GET', 'POST'])


def login():
if request.method == 'POST':
email = request.form.get('email')
password = request.form.get('password')

user = users.get(email)
if user:
if user['password'] == password:
session['user_email'] = email # Set the session for logged-in user
flash('Login successful!', 'success')
return redirect(url_for('index'))
else:
flash('Invalid credentials. Please try again.', 'error')
else:
# Redirect new users to the signup page
flash('This email is not registered. Please sign up.', 'error')
return redirect(url_for('signup'))

return render_template('login.html')

@app.route('/profile', methods=['GET', 'POST'])


def profile():
if 'user_email' in session:
user_email = session['user_email']
user = users.get(user_email)

if not user:
flash('User not found!', 'error')
return redirect(url_for('login'))

# Handle preferences and password updates


if request.method == 'POST':
preferences = request.form.getlist('preferences')
news_sources = request.form.getlist('news_sources')
languages = request.form.getlist('languages')
new_password = request.form.get('new_password')
if new_password:
user['password'] = new_password
flash('Password updated successfully!', 'success')

user['preferences'] = preferences
user['news_sources'] = news_sources
user['languages'] = languages

flash('Preferences updated successfully!', 'success')

return render_template('profile.html', user=user)

else:
flash('You need to log in first!', 'warning')
return redirect(url_for('login'))

@app.route('/logout')
def logout():
session.clear()
flash('You have been logged out.', 'success')
return redirect(url_for('index'))

init_db(app)

if __name__ == '__main__':
app.run(debug=True)

You might also like