見ます:
1.ファンクションビュー
接收请求,进行处理,与M和T进行交互,返回应答。
返回html内容HttpResponse,也可能重定向redirect,还可能是JsonResponse
2.ビュー機能の使用
2.1
1)ビュー関数が定義されています
request参数必须有,是一个HttpRequest类型的对象。参数名可以变化,但不要更改。
2)コンフィギュレーションのURL
建立url和视图函数之间的对应关系。
2.2 URLの設定プロセス
1)において、URLのプロジェクトファイル含ま特定のアプリケーションのURLのファイルを、特定の用途における特定のURLのURLファイルビューとの対応関係が含まれています。
2)URL構成要素は、各要素が構成要素であるurlpatternsと呼ばれるリストで定義され、各設定項目は、URL関数を呼び出します。
完全なプロセスの3.urlの試合:
- 1)ドメイン名を削除し、次のパラメータ、左/のaindex、その後の/除去、残りのaindex前に
- 対応する処理動作を実行後ろ2)、マッチングが成功した後、マッチングの成功は、文字の一部を除去することで、下に一致するトップのための初のaindex url.pyプロジェクトファイルを取ります
- そして、下の試合に、アプリケーションの後、先頭に残りurls.pyインデックスファイルを取ります。---?また、削除された後、一部をドメイン名を削除
- 3)した場合の一致がクライアントに返さコールが生成したコンテンツに対応する図です。試合は404エラーを生成するために失敗した場合。
4.エラー表示:
- 404:ページが見つかりません、デバッグモードを使用すると、カスタムページを表示したい場合は、次のテンプレートディレクトリ、カスタム404.htmlファイルを必要とする、デフォルトのディスプレイで標準エラーページをオフにしています。
- a)のURLが設定されていません
- b)は、URLの設定エラー
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404错误页面</title>
<style type="text/css">
</style>
</head>
<body>
<h1>页面找不到--{{ request_path }}</h1>
<!--request_path:Django会传过来一个模板变量,包含请求的地址-->
</body>
</html>
- 500:サーバー側のエラーは、カスタム500ページ、テンプレート/ 500.htmlすることができます。
a)のビュー(views.py)エラー
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>500错误页面</title>
<style type="text/css">
</style>
</head>
<body>
<h1>服务器错误</h1>
</body>
</html>
- settings.pyファイルで、デバッグモードをオフにするウェブサイトの開発の必要性:
- DEBUG = Falseの
- ALLOWED_HOST = [ '*']
5.キャプチャurlパラメータ
进行url匹配时,把所需要的捕获的部分设置成一个正则表达式组,
这样django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数。
- 1)位置パラメータ
- 位置パラメータは、パラメータ名は任意とすることができます
from django.conf.urls import url from booktest import views urlpatterns = [ url(r'^index$', views.index), # 首页 url(r'^showarg(\d+)$', views.showarg), # 捕获url参数: 位置参数 ]
from django.http import HttpResponse
def showarg(request, num): # url中捕获的num必须传入
return HttpResponse(num)
- 11を与えるために入力http://192.168.1.106:8000/showarg11、
- 2)キーワード引数:正規表現のグループ名に位置パラメータに基づいてすることができます。
- ?P <グループ名>
- キーワード引数、ビューパラメータ名と同じ表現グループとポジティブに名前を付ける必要があります---デフshowarg(リクエスト、NUM):numが、URL(R「^ showarg(Pなければなりませんか?
URLと一致\ D +)$」、views.showarg)、
# urls.py
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^index$', views.index), # 首页
url(r'^showarg(?P<num>\d+)$', views.showarg), # 捕获url参数:关键字参数
]
通常のケースでは6ログイン
- デフ指数(要求):要求での役割:
- リクエストの種類としては、ブラウザの要求に関する情報が含まれているのHttpRequestオブジェクトである、いくつかのプロパティの要求は、情報を得ることができます。Djangoは、包装の層を行います
- 1)ログインページを表示
- ブラウザを介してアクセスする)設計のURL、http://127.0.0.1:8000/loginは時にログインページが表示されます。
- URLに対応するログインビュー機能のb)のデザイン。
C)テンプレートファイルlogin.htmlとを準備します。
`` `のpythonviews.py
django.shortcutsからレンダリングインポート
ログインDEF(要求):
'' 'ログインページ' ''
レンダリングを返す(要求を、 'booktest / login.htmlと'、{})
`` `
# urls.py
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^index$', views.index), # 首页
# url(r'^showarg(\d+)$', views.showarg), # 捕获url参数: 位置参数
url(r'^showarg(?P<num>\d+)$', views.showarg), # 捕获url参数:关键字参数
url(r'^login$', views.login) # 显示登录页面
]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<style type="text/css">
</style>
</head>
<body>
<!--POST:提交的参数在请求头中。---数据安全性比较高时,使用post-->
<!--GET:提交的参数在url中。-->
<!--http://192.168.1.106:8000/login_check?username=abc&password=111-->
<!--<form method="get" action="/login_check">-->
<form method="post" action="/login_check">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
- url 视图 模板文件
- /login login login.html
# QueryDict对象的使用方法:
# 赋值: q = QueryDict('a=1&b=2&c=3')
# 取值:两种方式q['a']、q.get('a')
# 直接取没有的值会报错django.utils.datastructures.MultiValueDictKeyError: 'd'
# 但是用q.get('d')就不会报错,会显示没有值(返回None)---可用q.get('d', 'default')的方式,没有时,会返回默认值
>>> from django.http.request import QueryDict
>>> q = QueryDict('a=1&b=2&c=3')
>>> q['a']
'1'
>>> q['b']
'2'
>>> q['c']
'3'
>>> q.get('a')
'1'
>>> q.get('d', 'default')
'default'
# 和dict的本质区别,字典的key唯一,但Querydict允许一个key对应多个value,取多个值时,需要用getlist()方法来获取
>>> q1 = QueryDict('a=1&a=2&a=3&b=4')
>>> q1['a']
'3'
>>> q1.get('a')
'3'
>>> q1.getlist('a')
['1', '2', '3']
- 2)ログのチェック機能
- a)は、設計のURL、検証要求http://127.0.0.1:8000/login_checkをログに記録するログインページを開始するためのログインボタンをクリックします。
- URLに対応するlogin_checkビュー機能のb)のデザイン。
- データは上のフォーム送信を受けました。
- 正しいユーザー名とパスワードが正常にログインページをジャンプする場合は、チェックしてログインします。もし、ログインページにジャンプすることができません。
- c)のホームページへのログインに成功ジャンプした後。
- URLビュー・テンプレート・ファイル
- / login_check login_check无
# urls.py from django.conf.urls import url from booktest import views urlpatterns = [ url(r'^index$', views.index), # 首页 # url(r'^showarg(\d+)$', views.showarg), # 捕获url参数: 位置参数 url(r'^showarg(?P<num>\d+)$', views.showarg), # 捕获url参数:关键字参数 url(r'^login$', views.login), # 显示登录页面 url(r'^login_check$', views.login_check), ]
def login_check(request):
'''登录校验视图'''
# request.POST 保存的是POST提交的参数-都为QueryDict对象
# request.GET 保存的是GET提交的参数-都为QueryDict对象 ---直接通过浏览器输入的方式是Get方式
# 1. 获取提交的用户名和密码---登录的信息,保存在request中
# print(type(request.POST)) # 后台显示类型为:<class 'django.http.request.QueryDict'>
username = request.POST.get('username')
password = request.POST.get('password')
print(username+':'+password) # abc:111
# 2.进行登录的校验
# 实际开发:根据username和password查找数据库
# 模拟 abc 111
if username == 'abc' and password == '111':
# 正确,跳转到首页
return redirect('/index')
else:
# 错误,跳转到登录页面
return redirect('/login')
# 3.返回应答
# return HttpResponse('ok')
プロパティ
- そうでない場合は、以下の指示がない限り、プロパティは読み取り専用です。
- パス:要求されたページのフルパスを表す文字列は、ドメイン名やパラメータが含まれていません。
- 方法:「GET」、「POST」:HTTPリクエストメソッド、一般的に使用される値を表す文字列。
- これは、ブラウザのアドレスは、ハイパーリンクなどのgetメソッドを使用して、要求を行う与えます。
- フォームをクリックして、ブラウザでは、フォームのメソッドがポストにポストの要求を設定した場合は、要求を開始するためにボタンを提出します。
- エンコード:文字列が送信符号化モードデータを示します。
- なしていることを示していない場合は、通常、UTF-8、ブラウザを使用して、既定の設定。
- このプロパティは書き込み可能です、あなたが変更することで使用されるフォームエンコードされたデータにアクセスするためにそれを修正することができ、そのプロパティへのアクセスは、新しいエンコーディング値を使用します。
- GET:辞書に類似したオブジェクトの種類のQueryDictを、GETリクエストパラメータのすべての方法を含みます。
- POST:ポスト要求モードのすべてのパラメータを含む辞書に類似したオブジェクトの種類のQueryDict、。
- FILES:すべてアップロードされたファイルが含まれている同様のオブジェクトディクショナリ。
- クッキー:クッキーのすべてを含むA標準のPython辞書、キーと値は文字列です。
- セッション:被験者が読みだけでなく、辞書などを書くことができますが、Djangoは参照、詳細については、利用可能なサポートセッションを有効にする場合にのみ、現在のセッションを表し、「状態の遺骨を。」
- サーバーを実行して、ブラウザでのブラウザのホームページには、次の図では、ブラウザの「開発ツール」の情報を見ることを要求することができます。
7.アヤックス
7.1基本概念
异步的javascript。在不全部加载某一个页面的情况下(整体刷新--会导致用户体验很差),对页面进行局的刷新,ajax请求,即使出错,也都在后台。
图片,css文件,js文件都是静态文件
- 1)AJAX要求を開始:jQueryが発足
- それぞれ、保留にA / test3に/静的/静的なフォルダを作成し、新しい/ TEST3 /静的/ CSS / test3に/静的/画像、/ test3に/静的/ jsのフォルダ。
- 設定setting.pyで
- それぞれ、保留にA / test3に/静的/静的なフォルダを作成し、新しい/ TEST3 /静的/ CSS / test3に/静的/画像、/ test3に/静的/ jsのフォルダ。
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 设置静态文件的保存目录
- 2)対応するビュー機能の実装は、コンテンツJSONを返します
# views.py
from django.http import HttpResponse, JsonResponse
# /test_ajax
def ajax_test(request):
'''显示ajax页面'''
return render(request, 'booktest/test_ajax.html')
def ajax_handle(request):
'''ajax请求处理'''
# 返回的json数据{'res':1},JsonResponse会将{'res':1}转换为json数据,返回给浏览器,浏览器中.success(function (data)的data即可接收参数
return JsonResponse({'res': 1})
3)対応するコールバック関数を実行します。JSONの内容を決定することにより、それが処理されます。
- / TEST3 /静的/ JS /中でjqueryの-1.12.4.min.jsファイル
- jQueryのファイルを使用します。
- 新TEST3 /テンプレート/ booktest / test_ajax.html、<SCRIPT>インポート
- jQueryのファイルを使用します。
<!--test_ajax.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
<script>
$(function () {
// 绑定btnAjax的click事件
$('#btnAjax').click(function () {
$.ajax({
'url': '/ajax_handle',
// 'type': 'get', 默认即为get,可以不写
'dataType': 'json'
}).success(function (data) { // 执行成功后,会返回data
// 进行处理,通过alert取出data中的返回值 res
// alert(data.res)
if (data.res == 1){
$('#message').show().html('提示信息')
}
})
})
})
</script>
<style type="text/css">
#message {
dispaly: none;
color: red;
}
</style>
</head>
<body>
<!--点击按钮,页面加载完成后,绑定事件id="btnAjax"-->
<input type="button" id="btnAjax" value="ajax请求">
<div id="message"></div>
</body>
</html>
# urls.py
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^index$', views.index), # 首页
# url(r'^showarg(\d+)$', views.showarg), # 捕获url参数: 位置参数
url(r'^showarg(?P<num>\d+)$', views.showarg), # 捕获url参数:关键字参数
url(r'^login$', views.login), # 显示登录页面
url(r'^login_check$', views.login_check),
url(r'^test_ajax$', views.ajax_test),
url(r'^ajax_handle$', views.ajax_handle), # ajax处理
]
- この場合、ブラウザは要求ページtest_ajaxに行きますが、要求に「GET / ajax_handle HTTP / 1.1」200 10はありません
非同期および同期の概念
异步:发起请求后,不等待回调函数[.success(function (data) { }]的执行,代码继续向下走,直到服务器将json传回后,才会继续执行回调函数
同步:ajax也可以发起同步请求,将'async'设置为false
<script>
$(function () {
// 绑定btnAjax的click事件
$('#btnAjax').click(function () {
alert(1)
$.ajax({
'url': '/ajax_handle',
// 'type': 'get', 默认即为get,可以不写
'dataType': 'json',
//'async': false, //同步ajax请求,默认true
}).success(function (data) { // 执行成功后,会返回data
// 进行处理,通过alert取出data中的返回值 res
alert(2)
// alert(data.res)
if (data.res == 1){
$('#message').show().html('提示信息')
}
})
alert(3)
})
})
</script>
7.2 Ajaxのログインケース
- 1)首先分析出请求地址时需要携带的参数。
- username、password
- 2)视图函数处理完成之后,所返回的json的格式。
- 登录成功之后的json数据格式{'res':1}、和失败后的json数据格式{'res':0}要做一个设计
- 通过判断'res'的值,来判断登录是成功还是失败了
- 1)ログインページを表示
- ブラウザを介してアクセスする)設計のURL、http://127.0.0.1:8000/login_ajaxは時にログインページが表示されます。
URLに対応するlogin_ajaxビュー機能のb)のデザイン。
C)テンプレートファイルlogin_ajax.htmlを準備します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax登录页面</title>
<style type="text/css">
</style>
</head>
<body>
<!--<form method="post" action="/login_check">使用ajax的话,就不用表单请求了-->
<div>
{% csrf_token %}
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
<!--<input type="submit" value="登录">不用表单,则type改为button-->
<input type="button" id="btnLogin" value="登录">
</div>
<!--</form>-->
</body>
</html>
- インサイドはjqueryのAJAX要求を開始するためのコードを記述します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax登录页面</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
<script>
$(function () {
$('#btnLogin').click(function () {
// 1.获取username和password
username = $('#username').val()
password = $('#password').val()
// 2.发起post ajax请求,/login_ajax_check,携带用户名和密码
$.ajax({
'url':'/login_ajax_check', //需写对应的视图
'type': 'post',
'data': {'username':username, 'password':password},
'dataType': 'json'
}).success(function (data) {
// 登录成功 {'res':1} ---跳转到首页
// 登录失败 {'res':0}
if (data.res == 0){
$('#errmsg').show().html('用户名或密码错误')
}
else{
// 跳转到首页
location.href = '/index'
}
})
})
})
</script>
<style>
#errmsg{
display: none;
color: red;
}
</style>
</head>
<body>
<!--<form method="post" action="/login_check">使用ajax的话,就不用表单请求了-->
<div>
<!--此处会报csrf错误,添加了也不行,暂时注释掉setting.py中csrf处-->
{% csrf_token %}
用户名:<input type="text" id="username"><br/>
密码:<input type="password" id="password"><br/>
<!--<input type="submit" value="登录">不用表单,则type改为button-->
<input type="button" id="btnLogin" value="登录">
<div id="errmsg"></div>
</div>
<!--</form>-->
</body>
</html>
- 2)ログのチェック機能
- a)は、設計のURL、検証要求http://127.0.0.1:8000/login_ajax_checkをログに記録するログインページを開始するためのログインボタンをクリックします。
from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^index$', views.index), # 首页
# url(r'^showarg(\d+)$', views.showarg), # 捕获url参数: 位置参数
url(r'^showarg(?P<num>\d+)$', views.showarg), # 捕获url参数:关键字参数
url(r'^login$', views.login), # 显示登录页面
url(r'^login_check$', views.login_check),
url(r'^test_ajax$', views.ajax_test),
url(r'^ajax_handle$', views.ajax_handle), # ajax处理
url(r'^login_ajax$', views.login_ajax), # 显示ajax登录页面
url(r'^login_ajax_check$', views.login_ajax_check),
]
- URLに対応するlogin_ajax_checkビュー機能のb)のデザイン。
- ポストを介して受信したデータを提出してください。
- チェック、戻りJSONコンテンツでログインします。JsonResponse
- 次のようなJSON形式は次のとおりです。
- { 'RES': '1'}#は正常なログインを示し
- { 'RES': '0'}#ログイン失敗を示します
# /login_ajax_check
def login_ajax_check(request):
'''ajax登录校验'''
# 1.获取用户名和密码
username = request.POST.get('username') # 不管是表单POST提交,还是ajax-post提交,都放在request.POST中
password = request.POST.get('password')
# 2.进行校验,返回json数据
if username == 'abc' and password == '111':
# 用户名密码正确
return JsonResponse({'res': 1})
# return redirect('/index') # 如果是ajax返回的页面,不要直接使用redirect,会无法看到index,一直在后台
else:
# 用户名或密码错误
return JsonResponse({'res': 0})