sql server啟動不了, MSSQL 18052毛病: 9003,嚴重度: 20,狀況: 1 .。本站提示廣大學習愛好者:(sql server啟動不了, MSSQL 18052毛病: 9003,嚴重度: 20,狀況: 1 .)文章只能為提供參考,不一定能成為您想要的結果。以下是sql server啟動不了, MSSQL 18052毛病: 9003,嚴重度: 20,狀況: 1 .正文
回想
在後面的系列章節中,我們創立了一個數據庫而且學著用用戶和郵件來填充,然則到如今我們還沒可以或許植入到我們的法式中。 兩章之前,我們曾經看到怎樣去創立收集表單而且留下了一個完成完整的上岸表單。
在這篇文章中,我們將基於我門所學的收集表單和數據庫來構建並完成我們本身的用戶登錄體系。教程的最初我們小法式會完成新用戶注冊,上岸和加入的功效。
為了能跟上這章節,你須要前一章節最初部門,我們留下的微博法式。請確保你的法式曾經准確裝置和運轉。
在後面的章節,我們開端設置裝備擺設我們將要用到的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傳給了模板,調換了之間的假對象。
如今可以運轉我們的運用了。
當我們銜接到http://localhost:5000你將會看到上岸頁面。記住假如你經由過程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 %} <title>microblog</title> {% endif %} </head> <body> <div>Microblog: <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辦法。
最初的話
我們如今有了一個全功效的用戶登錄體系。鄙人一章中,我們將創立用戶的小我材料頁,並顯示用戶的頭像。
在此時代,這裡是更新的運用法式代碼,包含在這篇文章中的一切變更:
下載 microblog-0.5.zip 。