python登錄註冊改良版,Python註冊

本文目錄一覽:

python設計函數,實現會員註冊,要求用戶名長度不小於3,密碼長度不小於6, 註冊時兩次輸入密碼必須相同

def log_in():

username=input(“輸入用戶名(不小於3位)”)

if len(username)=3:

password=input(“密碼(不小於六位)”)

if len(password)=6:

pass_1=input(“再次輸入密碼”)

if password==pass_1:

print(“註冊成功”)

else:

print(“兩次輸入密碼不一致”)

log_in()

else:

print(“密碼長度不符合要求”)

log_in()

else:

print(“帳號長度不符合要求”)

log_in()

log_in()

我在使用python下的flask框架 但是我要怎麼實現sso登錄

單點登錄跟登錄其實差不多,理解了登錄也可以搞出單點登錄

回顧

在前面的系列章節中,我們創建了一個數據庫並且學着用用戶和郵件來填充,但是到現在我們還沒能夠植入到我們的程序中。 兩章之前,我們已經看到怎麼去創建網絡表單並且留下了一個實現完全的登陸表單。

在這篇文章中,我們將基於我門所學的網絡表單和數據庫來構建並實現我們自己的用戶登錄系統。教程的最後我們小程序會實現新用戶註冊,登陸和退出的功能。

為了能跟上這章節,你需要前一章節最後部分,我們留下的微博程序。請確保你的程序已經正確安裝和運行。

在前面的章節,我們開始配置我們將要用到的Flask擴展。為了登錄系統,我們將使用兩個擴展,Flask-Login 和 Flask-OpenID. 配置如下所示 (fileapp\__init__.py):

import os

from flaskext.login import LoginManager

from flaskext.openid import OpenID

from config import basedir

lm = LoginManager()

lm.setup_app(app)

oid = OpenID(app, os.path.join(basedir, ‘tmp’))

Flask-OpenID 擴展為了可以存儲臨時文件,需要一個臨時文件夾路徑。為此,我們提供了它的位置。

重訪我們的用戶模型

Flask-Login擴展需要在我們的User類里實現一些方法。除了這些方法以外,類沒有被要求實現其它方法。

下面是我們的User類 (fileapp/models.py):

class User(db.Model):

id = db.Column(db.Integer, primary_key = True)

nickname = db.Column(db.String(64), unique = True)

email = db.Column(db.String(120), unique = True)

role = db.Column(db.SmallInteger, default = ROLE_USER)

posts = db.relationship(‘Post’, backref = ‘author’, lazy = ‘dynamic’)

def is_authenticated(self):

return True

def is_active(self):

return True

def is_anonymous(self):

return False

def get_id(self):

return unicode(self.id)

def __repr__(self):

return ‘User %r’ % (self.name)

is_authenticated方法是一個誤導性的名字的方法,通常這個方法應該返回True,除非對象代表一個由於某種原因沒有被認證的用戶。

is_active方法應該為用戶返回True除非用戶不是激活的,例如,他們已經被禁了。

is_anonymous方法應該為那些不被獲准登錄的用戶返回True。

最後,get_id方法為用戶返回唯一的unicode標識符。我們用數據庫層生成唯一的id。

用戶加載回調

現在我們通過使用Flask-Login和Flask-OpenID擴展來實現登錄系統

首先,我們需要寫一個方法從數據庫加載到一個用戶。這個方法會被Flask-Login使用(fileapp/views.py):

@lm.user_loader

def load_user(id):

return User.query.get(int(id))

記住Flask-Login里的user id一直是unicode類型的,所以在我們把id傳遞給Flask-SQLAlchemy時,有必要把它轉化成integer類型。

登錄視圖函數

接下來我們要更新登錄視圖函數(fileapp/views.py):

from flask import render_template, flash, redirect, session, url_for, request, g

from flaskext.login import login_user, logout_user, current_user, login_required

from app import app, db, lm, oid

from forms import LoginForm

from models import User, ROLE_USER, ROLE_ADMIN

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

@oid.loginhandler

def login():

if g.user is not None and g.user.is_authenticated():

return redirect(url_for(‘index’))

form = LoginForm()

if form.validate_on_submit():

session[‘remember_me’] = form.remember_me.data

return oid.try_login(form.openid.data, ask_for = [‘nickname’, ’email’])

return render_template(‘login.html’,

title = ‘Sign In’,

form = form,

providers = app.config[‘OPENID_PROVIDERS’])

注意到我們導入了一些新的模塊,其中有些後面會用到。

跟上個版本的變化很小。我們給視圖函數添加了一個新的裝飾器:oid.loginhandler。它告訴Flask-OpenID這是我們的登錄視圖函數。

在方法體的開頭,我們檢測是是否用戶是已經經過登錄認證的,如果是就重定向到index頁面。這兒的思路是如果一個用戶已經登錄了,那麼我們不會讓它做二次登錄。

全局變量g是Flask設置的,在一個request生命周期中,用來存儲和共享數據的變量。所以我猜你已經想到了,我們將把已經登錄的用戶放到g變量里。

我們在調用redirect()時使用的url_for()方法是Flask定義的從給定的view方法獲取url。如果你想重定向到index頁面,你h很可能使用redirect(‘/index’),但是我們有很好的理由讓Flask為你構造url。

當我們從登錄表單得到返回數據,接下來要運行的代碼也是新寫的。這兒我們做兩件事。首先我們保存remember_me的布爾值到Flask的session中,別和Flask-SQLAlchemy的db.session混淆了。我們已經知道在一個request的生命周期中用Flask的g對象來保存和共享數據。沿着這條線路Flask的session提供了更多,更複雜的服務。一旦數據被保存到session中,它將在同一客戶端發起的這次請求和這次以後的請求中永存而不會消亡。數據將保持在session中直到被明確的移除。為了做到這些,Flask為每個客戶端建立各自的session。

下面的oid.try_login是通過Flask-OpenID來執行用戶認證。這個方法有兩個參數,web表單提供的openid和OpenID provider提供的我們想要的list數據項。由於我們定義了包含nickname和email的User類,所以我們要從找nickname和email這些項。

基於OpenID的認證是異步的。如果認證成功,Flask-OpenID將調用有由oid.after_login裝飾器註冊的方法。如果認證失敗那麼用戶會被重定向到login頁面。

Flask-OpenID登錄回調

這是我們實現的after_login方法(app/views.py)

@oid.after_login

def after_login(resp):

if resp.email is None or resp.email == “”:

flash(‘Invalid login. Please try again.’)

redirect(url_for(‘login’))

user = User.query.filter_by(email = resp.email).first()

if user is None:

nickname = resp.nickname

if nickname is None or nickname == “”:

nickname = resp.email.split(‘@’)[0]

user = User(nickname = nickname, email = resp.email, role = ROLE_USER)

db.session.add(user)

db.session.commit()

remember_me = False

if ‘remember_me’ in session:

remember_me = session[‘remember_me’]

session.pop(‘remember_me’, None)

login_user(user, remember = remember_me)

return redirect(request.args.get(‘next’) or url_for(‘index’))

傳給after_login方法的resp參數包含了OpenID provider返回的一些信息。

第一個if聲明僅僅是為了驗證。我們要求一個有效的email,所以一個沒有沒提供的email我們是沒法讓他登錄的。

接下來,我們將根據email查找數據庫。如果email沒有被找到我們就認為這是一個新的用戶,所以我們將在數據庫中增加一個新用戶,做法就像我們從之前章節學到的一樣。注意我們沒有處理nickname,因為一些OpenID provider並沒有包含這個信息。

做完這些我們將從Flask session中獲取remember_me的值,如果它存在,那它是我們之前在login view方法中保存到session中的boolean類型的值。

然後我們調用Flask-Login的login_user方法,來註冊這個有效的登錄。

最後,在最後一行我們重定向到下一個頁面,或者如果在request請求中沒有提供下個頁面時,我們將重定向到index頁面。

跳轉到下一頁的這個概念很簡單。比方說我們需要你登錄才能導航到一個頁面,但你現在並未登錄。在Flask-Login中你可以通過login_required裝飾器來限定未登錄用戶。如果一個用戶想連接到一個限定的url,那麼他將被自動的重定向到login頁面。Flask-Login將保存最初的url作為下一個頁面,一旦登錄完成我們便跳轉到這個頁面。

做這個工作Flask-Login需要知道用戶當前在那個頁面。我們可以在app的初始化組件里配置它(app/__init__.py):

lm = LoginManager()

lm.setup_app(app)

lm.login_view = ‘login’

全局變量g.user

如果你注意力很集中,那麼你應該記得在login view方法中我們通過檢查g.user來判斷一個用戶是否登錄了。為了實現這個我們將使用Flask提供的before_request事件。任何一個被before_request裝飾器裝飾的方法將會在每次request請求被收到時提前與view方法執行。所以在這兒來設置我們的g.user變量(app/views.py):

@app.before_request

def before_request():

g.user = current_user

這就是它要做的一切,current_user全局變量是被Flask-Login設定的,所以我們只需要把它拷貝到更容易被訪問的g變量就OK了。這樣,所有的請求都能訪問這個登錄的用戶,甚至於內部的模板。

index視圖

在之前的章節中我們用假代碼遺留了我們的index視圖,因為那個時候我們系統里並沒有用戶和博客文章。現在我們有用戶了,所以,讓我們來完成它吧:

@app.route(‘/’)

@app.route(‘/index’)

@login_required

def index():

user = g.user

posts = [

{

‘author’: { ‘nickname’: ‘John’ },

‘body’: ‘Beautiful day in Portland!’

},

{

‘author’: { ‘nickname’: ‘Susan’ },

‘body’: ‘The Avengers movie was so cool!’

}

]

return render_template(‘index.html’,

title = ‘Home’,

user = user,

posts = posts)

在這個方法中只有兩處變動。首先,我們增加了login_required裝飾器。這樣表明了這個頁面只有登錄用戶才能訪問。

另一個改動是把g.user傳給了模板,替換了之間的假對象。

現在可以運行我們的應用了。

當我們連接到你將會看到登陸頁面。記着如果你通過OpenID登錄那麼你必須使用你的提供者提供的OpenID URL。你可以下面URL中的任何一個OpenID provider來為你產生一個正確的URL。

作為登錄進程的一部分,你將會被重定向到OpenID提供商的網站,你將在那兒認證和授權你共享給我們應用的一些信息(我們只需要email和nickname,放心,不會有任何密碼或者其他個人信息被曝光)。

一旦登錄完成你將作為已登錄用戶被帶到index頁面。

試試勾選remember_me複選框。有了這個選項當你在瀏覽器關閉應用後重新打開時,你還是已登錄狀態。

註銷登錄

我們已經實現了登錄,現在是時候來實現註銷登錄了。

註銷登錄的方法灰常簡單(file app/views.py):

@app.route(‘/logout’)

def logout():

logout_user()

return redirect(url_for(‘index’))

但我們在模板中還沒有註銷登錄的鏈接。我們將在base.html中的頂部導航欄添加這個鏈接(file app/templates/base.html):

html

head

{% if title %}

title{{title}} – microblog/title

{% else %}

titlemicroblog/title

{% endif %}

/head

body

divMicroblog:

a href=”{{ url_for(‘index’) }}”Home/a

{% if g.user.is_authenticated() %}

| a href=”{{ url_for(‘logout’) }}”Logout/a

{% endif %}

/div

hr

{% with messages = get_flashed_messages() %}

{% if messages %}

ul

{% for message in messages %}

li{{ message }} /li

{% endfor %}

/ul

{% endif %}

{% endwith %}

{% block content %}{% endblock %}

/body

/html

這是多麼多麼簡單啊,我們只需要檢查一下g.user中是否有一個有效的用戶,如果有我們就添加註銷鏈接。在我們的模板中我們再一次使用了url_for方法。

最後的話

我們現在有了一個全功能的用戶登錄系統。在下一章中,我們將創建用戶的個人資料頁,並顯示用戶的頭像。

python模擬用戶登錄系統,如何兩個用戶輸入各自的密碼才能登入?

users = {‘root’: [‘123’, False], ‘westos’: [‘456’, False]}

while True:

  if all([x[1] for x in users.values()]):

      print(‘two users login successfully’)

      break

  user = input(‘input user name:\t’)

  if not users.get(user):

      print(‘unexist user’)

      continue

  else:

      for i in range(3):

          pw = input(‘input password:\t’)

          if users[user][0] == pw:

              print(f’user `{user}` login successfully’)

              users[user][1] = True

              break

用一個字典存儲username,pw以及登錄狀態. 10行判斷是否兩個人登錄狀態都為True,如果是,則打印並退出while. 否則13行輸入username,如果name不存在,while continue; 如果存在, 進入else,輸入密碼,密碼對則打印並修改狀態.超過3次退出for進入while.

Python Django寫登陸註冊界面,怎麼實現分教師端和學生端不同的註冊登錄

網頁鏈接

這個網頁看下,學生和教師登陸這個就學要兩個操作系統了,不過部分用相同的數據表,就是做一個出來,另一個就好寫了。

如何基於python腳本實現軟件的註冊功能

基於文本文檔(Markdown) 設想好需要的基本需要的表、字段、類型;使用 Rails Migration 隨着功能的開發逐步創建表;隨着細節功能的開發、需求,逐步增加字段,刪除字段,或者調整字段類型;第一個 Release 的時候清理 Migrations 合併成一個;隨着後期的改動,逐步增加、修改、刪除字段或表。基本上我的所有項目都是這麼搞的,這和項目是否複雜無關。所以我前面為什麼說思路需要轉變。

利用Python模擬註冊蘋果id

這就涉及到python的內存管理機制了,python裡面,所有變量都是對象,數據在內存中佔用物理內存,然後指針的頭指向不同的對象,就好比兩台相同的電腦,編號卻不一樣,這其實是兩個對象;但是也不是所有對象都是這樣處理的,為了節省內存,對於小的整數和短的字符串,python在處理的時候會把相同的數據指向不同的對象,但它們的id是一樣的。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/306368.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 12:00
下一篇 2025-01-02 12:00

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python編程二級證書考試相關現已可以上網購買

    計算機二級Python考試是一項重要的國家級認證考試,也是Python編程的入門考試。與其他考試一樣,Python編程二級證書的考生需要進入正式考試,而為了備考,這篇文章將詳細介紹…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29

發表回復

登錄後才能評論