Django之初
Django的开始:
#安装Django: pip3 install django #创建Django项目: django-admin startproject 项目名 比如: django-admin startproject mystie #启动socket服务端,等待用户发送请求 python manage.py runserver 127.0.0.1:8080
Django的创建APP:
>>:django-admin startproject mysite #创建django项目 >>:cd mysite #切换到mysite项目路径下 >>mysite:python manage.py startapp app01 #创建项目里的应用路径 ###具体应用在路由系统里使用。不同的功能,用不同的App。
Django的目录结构:
mysite项目名 mysite(项目同名文件夹) - settings.py #Django配置文件 - url.py # 路由系统:url->函数 - wsgi.py #web服务网关接口,用于定义Django用socket, wsgiref(默认的),uwsgi(生产环境中用的) #存放页面的文件夹 templates #静态文件夹 static #对当前Django程序所有操作可以基于 python manage.py runserver manage.py
Django的静态文件配置:
- 静态文件路径 static目录 STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )
Requset:用户请求的所有信息
GET请求:只有requset.get 有值
POST请求:requset.get 和 requset.post 都可以取值(get是请求头里url取值,post是请求体里取值)
redirect:要跳转的url
Django模板配置
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
Django的url演示:
在django中,要函数返回固定结果时,用HttpResponse,HttpResponse只写字符串。
需要导入 django.shortcuts 模块
在django中,每个函数都要有request参数。因为request参数里有用户的请求相关所有信息。并且request是对象的形式存在。
导入 django.shortcuts 模块中的 render 。可以返回页面给用户
render的第一个参数必须是request,第二个参数是需要跳转的页面。
导入静态样式:
在每个函数的第一个参数都是request,因为request里请求的所有信息,包括请求方式,是get还是post。所以,可以request.method来获取请求的方式结果。
判断是GET还是POST请求,并返回指定的页面,比如图中的login.html
而在前端,也可以设置用什么样的方式进行提交。如果是POST,还可以往action里提交,可以在action里在设置一个url,那样的话,POST会再发一次请求。发的请求会根据url去路由中去匹配。匹配到就会执行url对应的函数。
如图的method="POST" action="/login/" 这样的话,post请求会再发一个请求,去url中找到响应的url。并执行url对应的函数。
但是,这一次的请求就由get,改为了post。
既然请求已经改为post,那么在login函数中的 if 判断就不会走GET了,而应该 else 去找POST。
拿到的是一个字典类型的数据集。
<QueryDict: {'username': ['yanyan1314'], 'password': ['adfasd ']}>
而既然POST请求体里有数据,那怎么取来哩。
就这样取:
但是本人不建议,因为 [ ] 里的字符串一变,就找不着了。
所以,要用get的方法,很想字典取值的样子。这样的好处是,前端页面提交的数据,比如说没有username,他不会报错,而是提交一个None
用redirect方法,进行重定向,来实现跳转。旋转跳跃。
1 def login(request): 2 """ 3 处理用户请求,并返回内容 4 :param request: 用户请求的相关的所有信息(对象) 5 :return: 6 """ 7 #通过请求方式,返回不同的信息 8 if request.method == "GET": 9 return render(request,"login.html") 10 else: 11 print(request.POST) #用户POST提交的数据,(请求体里的数据) 12 username = request.POST.get("username") #取出字典里的数据。 13 password = request.POST.get("password") #取出字典里的数据。 14 if username == "yanyan" and password == "1314": 15 # 可以用 redirect 重定向,跳转到指定页面。 16 return redirect("http://www.baidu.com") 17 else: 18 #登录失败 19 return render(request,"login.html")
在登录中,用户名或密码错误,怎么报错哩?
铛铛铛铛:
在前端的login中加 { { msg } } , 这个特殊字符走的是if request.method == "GET" 这一行,但是要加在else里的登录失败的地方。所以在return中设置。在render中加第三的参数,是字典的形式。
login 函数:
1 from django.shortcuts import HttpResponse,render,redirect 2 3 def login(request): 4 """ 5 处理用户请求,并返回内容 6 :param request: 用户请求的相关的所有信息(对象) 7 :return: 8 """ 9 #通过请求方式,返回不同的信息 10 if request.method == "GET": 11 return render(request,"login.html") 12 else: 13 print(request.POST) #用户POST提交的数据,(请求体里的数据) 14 username = request.POST.get("username") #取出字典里的数据。 15 password = request.POST.get("password") #取出字典里的数据。 16 if username == "yanyan" and password == "1314": 17 # 可以用 redirect 重定向,跳转到指定页面。 18 return redirect("http://www.baidu.com") 19 else: 20 #登录失败 21 return render(request,"login.html",{"msg":"username or password is error"})
login.html 页面:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Login</title> 6 <link rel="stylesheet" href="/static/commons.css" /> 7 </head> 8 <body> 9 <h1>Login</h1> 10 <form method="POST" action="/login/"> 11 <input type="text" name="username"> 12 <input type="password" name="password"> 13 <input type="submit" value="Login"> 14 {{ msg }} 15 </form> 16 </body> 17 </html>
在url中传的之,是可以通过request.GET 获取到的。
POST请求和GET请求的区别:GET请求只有request.GET 的url中有值。在GET到头里有值,体里没值。
POST请求在request.POST和POST的请求体里都有值。
如果在后端的render中的{{msg}}中有列表数据:那么在前端如何呈现我想要的列表索引数据:
1 def index(request): 2 """ 3 处理用户请求,并返回内容 4 :param request: 用户请求的相关的所有信息(对象) 5 :return: 6 """ 7 return render( 8 request, 9 "index.html", 10 { 11 "name":"george", 12 "users":["hhhhhhhhhhh","aaaaaaaaa"], 13 } 14 )
页面效果:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>index</title> 6 </head> 7 <body> 8 <h1>index</h1> 9 <h1>模板标记</h1> 10 <p>{{ name }}</p> 11 <p>{{ users.0 }}</p> #就用 “.” 的形式取索引。 12 <p>{{ users.1 }}</p> 13 14 </body> 15 </html>
结果:
那既然列表可取,字典该当如何取值啦~:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <h1>index</h1> <h1>模板标记</h1> <p>{{ name }}</p> <p>{{ users.0 }}</p> <p>{{ users.1 }}</p> <p>{{ user_dict.k1 }}</p> <p>{{ user_dict.k2 }}</p> </body> </html>
结果:
不仅仅是字典可以,还可以循环呢!循环列表里的字典
惊不惊讶,意不意外:
index 函数:
1 def index(request): 2 """ 3 处理用户请求,并返回内容 4 :param request: 用户请求的相关的所有信息(对象) 5 :return: 6 """ 7 return render( 8 request, 9 "index.html", 10 { 11 "name":"george", 12 "users":["hhhhhhhhhhh","aaaaaaaaa"], 13 "user_dict":{"k1":"v1","k2":"v2"}, 14 'user_list_dict': [ 15 {'id': 1, 'name': 'George', 'email': 'George@163.com'}, 16 {'id': 2, 'name': 'George2', 'email': 'George@1632.com'}, 17 {'id': 3, 'name': 'George3', 'email': 'George@1632.com'}, 18 ] 19 } 20 )
index.html 页面:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>index</title> 6 </head> 7 <body> 8 <h1>index</h1> 9 <h1>模板标记</h1> 10 <p>{{ name }}</p> 11 <p>{{ users.0 }}</p> 12 <p>{{ users.1 }}</p> 13 <p>{{ user_dict.k1 }}</p> 14 <p>{{ user_dict.k2 }}</p> 15 <h3>循环</h3> 16 {% for item in users %} #循环的开头 17 {{ item }} #每个item,就是每个循环的元素 18 <h1>{{ item }}</h1> #每个item,就是每个循环的元素 19 {% endfor %} #循环的结尾 20 <ul> 21 {% for foo in users %} 22 <li>{{ foo }}</li> 23 {% endfor %} 24 </ul> 25 <h1>列表里的字典</h1> 26 <ul> 27 {% for foo in user_list_dict %} 28 <li>{{ foo.id }} === {{ foo.name }} === {{ foo.email }}</li> 29 {% endfor %} 30 31 </ul> 32 33 </body> 34 </html>