Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 Web 应用程序框架。使用 Django,我们在几分钟之内就可以创建高品质、易维护、数据库驱动的应用程序。
环境: MacOS python3.7 ,django 3.0
1.安装
python3 install django
2.创建Django项目并启动
-
命令行创建
cd 项目保存路径
Django-admin startproject 项目名
cd 项目名
-
python3 manage.py runserver 127.0.0.1:8080
启动Django项目
-
Pycharm 创建
- File -- New Project -- Django
- Location中填写django保存的目录,create 创建
- New Window 打开
3.项目启动
- 命令行启动方式
-
python3 manage.py runserver IP:端口
----> 在指定的IP和端口启动 -
python3 manage.py runserver 端口
-----> 在指定的端口启动 -
python3 manage.py runserver
----> 默认在本机的8000端口启动
-
- Pycharm 启动
点绿色小三角,直接可以启动Django项目(前提是小三角左边是你的Django项目名)
4.项目结构
以项目名为
mysite
为例子
- mysite
- __ init __.py ---> 初始化文件
- asgi.py
- settings.py ---> 项目设置文件,配置模板文件,静态文件,数据库信息
- urls.py ---> 路由系统:url->函数
- wsgi.py ---> web服务网关接口,
wsgiref
本机测试使用,因效率比较低,生产环境使用uwsgi
- templates
- manage.py ---> 对当前Django程序所有操作可以基于
python manage.py runserver
5.第一个项目
使用Pycharm启动项目后,在mysite
目录下的urls.py
中,可以看到Django框架自动生成了一段代码admin
代码
urlpatterns = [
path('admin/', admin.site.urls),
]
在浏览器中输入127.0.0.1:8000\adimin
就会有Django项目自带的登录页面出现。说明项目已经运行成功。
6.编写自己的登录页面
在urls.py
中的urlpatterns
list中添加自己的登录页面。在Django2.x中url
关键字,3.x变为path
关键字
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', login)
]
引入Django框架中的HttpResponse
,然后编写login函数
from django.shortcuts import HttpResponse
def login(request):
'''
处理用户请求,并返回内容
:param request 用户请求相关的所有信息(对象)
:return
HttpResponse 只能返回字符串
'''
return HttpResponse('登录成功')
保存后代码,就可以在浏览器中输入127.0.0.1:8000\login
,就可以看见浏览器显示了登录成功的字符串。
我们还可以返回html标签,把login
函数中的return HttpResponse('登录成功')
改成return HttpResponse('<input type="text"/>')
from django.shortcuts import HttpResponse
def login(request):
'''
处理用户请求,并返回内容
:param request 用户请求相关的所有信息(对象)
:return
HttpResponse 只能返回字符串
'''
return HttpResponse('<input type="text"/>')
刷新浏览器就可以看到,出现了我们返回的html标签的输入框。
7.返回HTML页面
在templates文件夹下,创建login.html
文件,在body
标签中加入<h1>用户登录</h1>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<h1>用户登录</h1>
</body>
</html>
重新编写login函数,让其返回HTML
页面.因为HttpResponse
函数只能返回字符串,所以需要引入render
函数。
from django.shortcuts import render
def login(request):
'''
处理用户请求,并返回内容
:param request 用户请求相关的所有信息(对象)
:return
HttpResponse 只能返回字符串
render 返回HTML文件
'''
# return HttpResponse('<input type="text"/>')
return render(request,'login.html')
再次打开127.0.0.1:8000\login
就可以看见浏览器显示了当前login.html
文件
8.添加静态文件
在更目录下创建sta
文件夹,在sta
文件夹下创建commons.css
文件.编写h1
标签的颜色
h1{
color: red;
}
在login.html
中引入css
文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>login</title>
<link rel="stylesheet" href="/sta/commons.css">
</head>
<body>
<h1>用户登录</h1>
</body>
</html>
保存刷新浏览器,发现h1
标签并没有变成红色。
这是因为Django框架没有找到commons.css
文件。
这时我们需要在settings.py
中编辑静态文件和模板的配置
9.编辑静态文件和模板的配置
打开settings.py
文件。找到TEMPLATES
.这个就是配置模板(html)文件路径的地方。
需要'DIRS': [os.path.join(BASE_DIR, 'templates')]
中的templates
和根目录下存放模板文件的文件名一致,否则就会不能返回对应的html
文件。
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',
],
},
},
]
在settings.py
文件,文件中找到STATIC_URL = '/static/'
,这是配置静态文件路径的地方。添加STATICFILES_DIRS
。并在里面添加os.path.join(BASE_DIR,'sta'),
对应文件名。
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'sta'),
)
刷新浏览器,发现h1
标签还是没有变红。这是因为STATIC_URL = '/static/'
是虚拟路径,STATICFILES_DIRS
是真实路径。只有在项目中出现了/static/
才会去STATICFILES_DIRS
真实路径中寻找。
所以这时候只要把login.html
中的css
引用改为<link rel="stylesheet" href="/static/commons.css">
即可。再刷新,h1
标签已经变红了。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>login</title>
<link rel="stylesheet" href="/static/commons.css">
</head>
<body>
<h1>用户登录</h1>
</body>
</html>
为了方便起见我们会直接把静态文件的文件夹名起成static
,这样编写代码比较方便会有提示
修改根目录下的sta
文件名为static
.重新编写STATICFILES_DIRS
.
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
# 使用时前缀.只要有 static 就去 下面的 真实目录STATICFILES_DIRS中找
# 为了方便都就都可以创建 static 文件夹
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)
10.接收HTML页面返回的参数
浏览器中输入127.0.0.1:8000/login
是GET
请求。我们需要拿到用户名和密码进行验证,就需要在用户点击登陆
按钮的时候进行post请求。
编写login.html
文件,添加输入框和确定按钮.保存,刷新浏览器。会出现2个输入框和一个登陆按钮
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>login</title>
<link rel="stylesheet" href="/static/commons.css">
</head>
<body>
<h1>用户登录</h1>
<form action="/login/" method="post">
<input type="text" name="user">
<input type="text" name="pwd">
<input type="submit" value="登录">
</form>
</body>
</html>
编写urls.py
中的login
函数.打印request.POST
.打印结果就是输入框的内容组成的字典
def login(request):
'''
处理用户请求,并返回内容
:param request 用户请求相关的所有信息(对象)
:return
HttpResponse 只能返回字符串
'''
# return HttpResponse('<input type="text"/>')
print(request.POST)
#打印结果
<QueryDict: {'user': ['xiaoming'], 'pwd': ['123456']}>
这样我们就可以通过key-value
的形似来获取用户名和密码,来验证用户信息。从而最后返回一个连接,进行重定向。
登录失败的时候给用户一个提示信息。在login.html
中添加{{msg}}
语法
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>login</title>
<link rel="stylesheet" href="/static/commons.css">
</head>
<body>
<h1>用户登录</h1>
<form action="/login/" method="post">
<input type="text" name="user">
<input type="text" name="pwd">
<input type="submit" value="登录">
{{ msg }}
</form>
</body>
</html>
返回一个链接进行重定向就需要引入djange
中的redirect
函数
from django.shortcuts import redirect
def login(request):
'''
处理用户请求,并返回内容
:param request 用户请求相关的所有信息(对象)
:return
HttpResponse 只能返回字符串
render 返回html模板文件
redirect 重定向,返回一个链接
'''
# return HttpResponse('<input type="text"/>')
#自动找到模板路径下的login.html 文件,读取内容并返回给用户
#模板路径的配置
if request.method == "GET":
return render(request,'login.html')
else:
#post 提交时提交的数据(请求体)
print(request.POST)
u = request.POST['user']
p = request.POST['pwd']
if u== 'xiaoming' and p == '123456':
#登录成功.返回一个链接
return redirect('http://www.baidu.com')
else:
#登录失败
return render(request,'login.html',{'msg':"登录失败,用户名密码失败"})
保存代码,重新刷新浏览器,输入框内填写对应的账号密码。点击登录就会调转百度
11.返回项目中的页面链接
登录成功后我们不返回外部链接,而需要返回项目首页.
在urls.py
中添加index
函数,在urlpatterns
中添加对应链接.
如果是项目内的链接,redirect
函数会自动解析,自动加上请求链接的头尾内容。
from django.shortcuts import HttpResponse,render,redirect
def login(request):
'''
处理用户请求,并返回内容
:param request 用户请求相关的所有信息(对象)
:return
HttpResponse 只能返回字符串
'''
# return HttpResponse('<input type="text"/>')
#自动找到模板路径下的login.html 文件,读取内容并返回给用户
#模板路径的配置
if request.method == "GET":
return render(request,'login.html')
else:
#post 提交时提交的数据(请求体)
print(request.POST)
u = request.POST['user']
p = request.POST['pwd']
if u== 'xiaoming' and p == '123456':
#登录成功
# return redirect('http://www.baidu.com')
return redirect('/index/') #要返回的页面
else:
#登录失败
return render(request,'login.html',{'msg':"登录失败,用户名密码失败"})
def index(resquest):
return render(resquest,'index.html')
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', login),
path('index/',index),
]
在templates
文件夹下添加index.html
文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>
保存代码,重新刷新浏览器,输入框内填写对应的账号密码。就可以出现效果了。