Django(一) 安装使用基础
大纲
安装Django
1、创建Django工程
2、创建Django app
3、写一个简单的登录注册相应页面
4、获取用户请求信息并处理
5、前后端交互
6、Django 请求 生命周期
跳转到这里
7、django内容整理
安装Django
pip3 install django #python2.x 使用 `pip insall django`命令
windows安装后,添加Django安装路径的环境变量。
1、创建Django工程
django-admin startproject 【工程名称】 # 生成目录结构如下 mysite - mysite # 对整个程序进行配置 - __init__.py - settings.py # 配置文件 - urls.py # URL对应关系 - wsgi.py # 遵循WSGI规范,一般使用 uwsgi + nginx - manage.py # 管理Django程序:如下 - python manage.py # 运行程序 - python manage.py startapp xx # 创建app # Django的orm框架 - python manage.py makemigrations - python manage.py migrate
SGI本质上就是一个封装了socket的模块,调用接口就可以。
- 运行Django功能
python manage.py # 或如下 python manage.py runserver 127.0.0.1:8000
通过pycharm 也能创建django程序。
写一个基本完整的http请求
编辑urls.py 文件
from django.conf.urls import url from django.contrib import admin from django.shortcuts import HttpResponse # Http相应 def home(request): return HttpResponse('<h1>Hello</h1>') urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^h.html/', home), ]
启动后,访问:127.0.0.1:8000/h.html/
不过实际中,上面的home相当于一个业务功能,而不同的功能,在django中可以分别创建不同的app。
2、创建Django app
- 创建app
python manage.py startapp cmdb
把home函数移到cmdb\views.py中,
from django.shortcuts import HttpResponse def home(request): return HttpResponse('<h1>Hello</h1>')
urls.py修改如下:
from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^h.html/', views.home), ]
- app目录结构
migrations # django orm框架,修改表结构的操作记录(差异化) __init__ # python3中有没有都一样,python2中必须有 admin # Django为我们提供的后台管理 apps # 配置当前app models # ORM:写指定的类,通过命令可以创建数据库结构 tests # 单元测试 views # ****业务代码****
3、写一个简单的登录注册相应页面
新建一个templates 文件夹,用来存放html模板文件
views.py
# from django.shortcuts import HttpResponse from django.shortcuts import render # django帮我们打开文件并相应的模块 # 因为经常返回数据,打开文件,所以django使用render模块,做这个事情。 def login(request): # with open("templates/login.html", "r", encoding="utf-8") as f: # data = f.read() # return HttpResponse(data) return render(request, 'login.html') # 这里没有指定路径,在settings配置里,默认就已添加templates
templates/login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> label{ width: 80px; text-align: right; display: inline-block; } </style> </head> <body> <form action="/login" method="post"> <p> <label for="username">用户名:</label> <input id="username" type="text" /> </p> <p> <label for="password">密码:</label> <input id="password" type="text" /> <input type="submit" value="提交" /> </p> </form> </body> </html>
- js、css静态文件处理
页面里可能会包含css、js文件,这些静态文件也需要引入进来。
创建静态文件目录static,创建完之后还要在settings里面配置一下,最后面添加:
STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), # 必须加上都好“,” 不加就报错 )
login.html 文件中引入css、js
<link rel="stylesheet" href="/static/commons.css">
总结:
创建完project后,优先做几件事:
1、配置模板的路径
settings.py
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', ], }, }, ]
2、配置静态目录
# 创建static目录 # settings 最后添加静态文件配置 STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) # html模板文件引用css、js <link rel="stylesheet" href="/static/commons.css" />
4、获取用户请求信息并处理
- 注释掉CSRF
CSRF: 跨站请求伪造
后面会讲,这里先注释上,不然会报错
settings —> 找到MIDDLEWARE —> 注释掉
# 'django.middleware.csrf.CsrfViewMiddleware',
- request 包含了客户端发来的所有信息。
客户端发过来的信息,内部django、wsgi帮我们处理,处理之后会给我们一个结果。把客户端所有的信息打包然后发给我,怎么发呢?
就是上面函数形参 request :包含了客户端用户发来的所有信息。
比如:request.method
就是用户提交方式(get、post)。往往get获取表单;post方式提交数据。
form表单提交的时候,以类似字典的形式提交,所以要在html form里定义name
from django.shortcuts import render # django帮我们打开文件并返回给用户 from django.shortcuts import redirect # 重定向、跳转 def login(request): # request 包含用户提交的所有信息 error_msg = '' if request.method == "POST": # request.method 用户提交方法 # request.POST 用户通过POST提交过来的数据 user = request.POST.get('user', None) pwd = request.POST.get('pwd', None) # 不存在为None if user == 'root' and pwd == '123': # 用户跳转 return redirect("http://blog.csdn.net/lgeng") else: # 用户名密码错误。 error_msg = "用户名或密码错误" return render(request, 'login.html', {"error_msg":error_msg}) # "error_msg:网页中定义的特殊文本,key"
- Django模版语言
用户名密码错误,怎么给用户返回数据?
需要借助另外一件事:在模板里面,在Django里面可以写一些特殊的内容。
{{ }}
Django 对其进行替换。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/commons.css"> <style> label{ width: 80px; text-align: right; display: inline-block; } </style> </head> <body> <form action="/login/" method="post"> {# action="/home":提交到http://127.0.0.1/home/ #} <p> <label for="username">用户名:</label> <input id="username" name="user" type="text" /> </p> <p> <label for="password">密码:</label> <input id="password" name="pwd" type="password" /> <input type="submit" value="提交1" /> <span style="color: red">{{ error_msg }}</span> {# Django里面可以写一些特殊的内容,后台进行替换 #} </p> </form> </body> </html>
注意:网页action提交那里 action="/login/"
,要和urls.py 里 url(r'^login/', views.login),
保持一致!!!
要是login/
全是login/
,要是login
全是login
,否则点击提交会报错:
RuntimeError at /login You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000/login/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.
web框架中,之后Django中会报这个错。
PS:配置过程中,可能会种种原因遇到报错,这时候可以从django相应的过程中,逐步排查,最终找到错误点
5、前后端交互
urls.py :url(r'^home', views.home),
views.py
from django.shortcuts import render USER_LIST = [ {'user':'alex', 'email': 'a.126.com', 'gender': "男"}, {'user':'lily', 'email': 'a.126.com', 'gender': "女"}, {'user':'lgeng', 'email': 'a.126.com', 'gender': "男"}, ] def home(request): if request.method == "POST": u = request.POST.get('username') e = request.POST.get('email') g = request.POST.get('gender') temp = {'username':u, 'email':e, 'gender':g} USER_LIST.append(temp) return render(request, "home.html", {'user_list':USER_LIST})
templates/home.html
- 注意下:django 模板语言for循环写法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body style="margin: 0"> <div style="height: 48px;</div> <div> <form action="/home" method="post"> <input type="text" name="username" placeholder="用户名" /> <input type="text" name="email" placeholder="邮箱"/> <input type="text" name="gender" placeholder="性别"/> <input type="submit" value="添加" /> </form> </div> <div> <table> {# django 模板语言for循环 (user_list:后端定义的全局变量) #} {% for row in user_list %} <tr> {# 这里row代表字典,去索引用row.email,而不是row['email'] #} <td>{{ row.username }}</td> <td>{{ row.gender }}</td> <td>{{ row.email }}</td> </tr> {% endfor %} </table> </div> </body> </html>
6、Django 请求 生命周期
- 1)客户端请求
- 2)路由系统:urls.py,路由关系映射
- 3)视图函数:app/views.py,功能函数
- 4)视图函数从DB等取数据,并嵌套到html中(html模板templates中)。渲染或组合,最终生成字符串返回给用户
转载请务必保留此出处:http://www.cnblogs.com/lgeng/p/7363852.html
7、django内容整理
- 配置
1. 创建Django工程 django-admin startproject 工程名 2. 创建APP cd 工程名 python manage.py startapp cmdb 3、静态文件 project.settings.py STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) 4、模板路径 DIRS ==> [os.path.join(BASE_DIR,'templates'),] 5、settings中 middlerware # 注释 csrf
- 使用
6、定义路由规则 urls.py "login" --> 函数名 7、定义视图函数 app下views.py def func(request): # request.method GET / POST # 获取数据 # http://127.0.0.1:8009/home?nid=123&name=alex # request.GET.get('',None) # 获取请求发来的数据 # request.POST.get('',None) # 返回数据 # return HttpResponse("字符串") # return render(request, "HTML模板的路径") # return redirect('/只能填URL') # 只返回url地址,让客户端再次请求,不会把跳转的数据发给客户端 # redirect('/login') 前面的"/"代指本地url,前面的域名端口
- 模板渲染
8、模板渲染
特殊的模板语言
-- {{ 变量名 }}
views.py
def func(request): return render(request, "index.html", {'current_user': "lgeng"})
index.html
<html> .. <body> <div>{{current_user}}</div> </body> </html>
====> 最后生成的字符串,返回给用户
<html> .. <body> <div>lgeng</div> </body> </html>
-- For循环
views.py
def func(request): return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']})
index.html
<html> .. <body> <div>{{current_user}}</div> <ul> {% for row in user_list %} {% if row == "alex" %} <li>{{ row }}</li> {% endif %} {% endfor %} </ul> </body>
</html>
###索引#################
def func(request): return render(request, "index.html", { 'current_user': "alex", 'user_list': ['alex','eric'], 'user_dict': {'k1': 'v1', 'k2': 'v2'}})
index.html
<html> .. <body> <div>{{current_user}}</div> <a> {{ user_list.1 }} </a> # 取列表 <a> {{ user_dict.k1 }} </a> # 取字典 <a> {{ user_dict.k2 }} </a> </body> </html>
###### 条件
def func(request): return render(request, "index.html", { 'current_user': "alex", "age": 18, 'user_list': ['alex','eric'], 'user_dict': {'k1': 'v1', 'k2': 'v2'}})
index.html
<html> .. <body> <div>{{current_user}}</div> <a> {{ user_list.1 }} </a> <a> {{ user_dict.k1 }} </a> <a> {{ user_dict.k2 }} </a> {% if age %} <a>有年龄</a> {% if age > 16 %} <a>老</a> {% else %} <a>少</a> {% endif %} {% else %} <a>无年龄</a> {% endif %} </body> </html>
<!-- END -->
《版权说明》-- 本文转自: http://blog.csdn.net/fgf00/articdetails/53522613