参考:最新Python的web开发全家桶(django+前端+数据库)
pip install django
安装完成后,在python文件夹中将会多出两个部分
F:\Python39
- python.exe
- Scripts
- pip.exe
- django-admin.exe 【创建django项目的工具】
- Lib
- 内置模块
- site-packages
- openpyxl
- python-docx
- …
- django 【框架的源码】
Django中的项目会有一些默认的文件与文件夹,创建此以开始构建Django项目
第一步,打开终端
第二步,进入项目目标目录(想把项目放在哪里就进入哪个目录)
命令行执行命令
(若未加入环境变量,可能需要补全路径) django-admin startproject 项目名
需要pycharm专业版
!!!注意,不要把Django项目目录和python安装目录放到一起,不然全乱了,想要更改Django项目把Python搞崩就不好了
命令行创建的是标准的文件结构,但是Pycharm创建的项目,会多一些东西
mysite
├── db.sqlite3
├── manage.py # 项目的管理,包括: 启动项目,创建app, 数据管理 【常用】
└── mysite
├── __init__.py
├── asgi.py # 接收网络请求 (异步) 【不用动】
├── settings.py # 项目配置(模板配置,数据库配置,注册app) 【常操作】
├── urls.py # url和函数的对应关系 【常操作】
└── wsgi.py # 接收网络请求 (同步) 【不用动】
APP —— 可以看作功能模块
- 项目
- app1 【用户管理】
- app2 【后台管理】
- app3 【网站】
- app4 【API】
- ...
每个APP都可以有独立的表结构、函数、CSS和HTML框架
在激活解释器环境后,在Django项目目录下,执行
python manage.py startapp 应用名
即可创建一个app
例子:
(venv) F:\Django Project\mysite>python manage.py startapp app01
文件结构
|—— app01
| |—— __init__.py
| |—— admin.py 【固定,不用动】django默认提供了admin后台管理
| |—— apps.py 【固定,不用动】app启动类
| |—— migration 【固定,不用动】数据库变更记录
| |—— models.py 【**重要**】对数据库操作
| |—— tests.py 【重要,不用动】单元ces
| |—— views.py 【**重要**】函数
|
|—— manage.py
|—— mysite
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py 【URL->函数】
└── wsgi.py
在项目同名文件夹下的 【settings.py】 文件中找到 INSTALLED_APPS ,添加应用配置类
例如:
在项目同名文件夹下的 【urls.py】文件中找到 urlpatterns,引入应用视图,添加路径函数映射
path('路径名','映射函数名')
例子:
在应用 【views.py】文件中,编写刚才在 url.py 中声明的函数
命令行启动
在项目路径下,执行
python manage.py runsever
Pycharm启动
之后即可访问目标网址
【urls.py】创建关系 -> 【views.py】实现函数
views.py的函数不仅仅可以返回字符串,还可以返回html文件
【views.py】导入render,使用函数
render(request,"html文件名")
而项目会自动找到【templates】目录,找到需要访问的html文件
例子:
【注意】这里找文件的方式不是只找自己app目录下的templates文件夹,而是按照在【seetings.py】中注册的app的顺序一个一个的访问templates文件夹,直到找到目标html文件
而在pycham建立django项目时,在根目录自动创建的templates文件夹和settings.py中填加的
'DIRS':[os.path,join(BASE_DIR,'templates')]
则会使系统优先去根目录下templates文件夹寻找,没有找到再逐一询问各个app的templates文件夹
在开发过程中,一般将图片、CSS、JS文件和插件等文件都当作静态文件处理
每个APP使用的静态文件必须放在自己目录下的【static】文件夹中
比较好的文件结构(分类存放)
- app01
- ...
- ...
- static
- img
- css
- js
- plugins
- ...
- ...
以上目录需要自己创建
在页面html文件中,推荐使用
{% load static %} 【导入静态文件路径】
src = “{% static 相对路径 %} 【获取资源】
的方法,便于后期静态文件的迁移与维护(静态文件改位置了,在【settings.py】中改一下 [ STATIC_URL ] 就可以,如果是绝对路径会非常麻烦)
例子
本质:在HTML中写一些占位符,由数据对这些占位符进行替换和处理
示例
## urls.py
urlpatterns = [
#path('admin/', admin.site.urls),
# www.xxx.com/index -> 执行函数
path('index/', views.index),
# path(路径名,映射函数名)
path('user/list/', views.user_list),
path('tpl', views.tpl),
]
## views.py
def tpl(request):
name = "王大壮"
roles = ["管理员","CEO","保安"]
user_info = {"name":"二狗","salary":10000,"role":"CTO"}
data_list = [
{"name":"唐三才","salary":19000,"role":"CEO"},
{"name": "赵四", "salary": 9000, "role": "manager"},
{"name": "伍员", "salary": 10000, "role": "CFO"}
]
return render(request,"tpl.html",{"n1":name,"n2":roles,"n3":user_info,"n4":data_list})
# 以字典形式传递参数
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<h1>模板语法的学习h1>
<div>{{ n1 }}div>
<div>{{ n2 }}div>
<div>{{ n2.0 }}div>
<div>{{ n2.1 }}div>
<div>{{ n2.2 }}div>
<div>
{% for item in n2 %}
<span>{{ item }} span>
{% endfor %}
div>
<hr/>
<div>{{ n3 }}div>
<div>{{ n3.name }}div>
<div>{{ n3.salary }}div>
<div>{{ n3.role }}div>
<ul>
{% for k,v in n3.items %}
<li>{{ k }} = {{ v }}li>
{% endfor %}
ul>
<hr/>
<div>{{ n4 }}div>
<div>{{ n4.0 }}div>
<div>{{ n4.1.name }}div>
<div>{{ n4.2.role }}div>
<ul>
{% for item in n4 %}
<div>{{ item.name }},{{ item.role }},{{ item.salary }}div>
{% endfor %}
ul>
<hr/>
{% if n1 == "王大壮" %}
<h1>666666h1>
{% elif n1 == "二狗" %}
<h1>你怎么穿着大壮的衣服?h1>
{% else %}
<h1>欸?h1>
{% endif %}
body>
html>
运行查看结果
【注意】模板语法是Django开发的,页面呈现顺序应该是:
用户浏览器中不可能看到模板语法的,其只会解析到标准的HTML语句
三种请求和响应方式
#【urls.py】
urlpatterns = [
path('something/', views.something),
]
#【views.py】
def something(request):
#request 是一个对象,封装了用户发过来的所有请求相关数据
#1. 获取请求方式 GET/POST
print(request.method)
#2. 在URL上传递一些值 (用户可以在浏览器地址栏进行输入,如:http://127.0.0.1:8000/something/?n1=123&n2=999)
print(request.GET)
#3. 在请求体中提交数据(请求体中的请求表面看不到)
print(request.POST)
#4. 【响应】HttpResponse("返回内容"),返回字符串给请求者
#return HttpResponse("返回内容")
#5. 【响应】render读取html的内容并进行渲染
#return render(request,"something.html",{'title':"来了"})
#6.【响应】重定向到其他页面(浏览器按照给出的链接,自行访问)
return redirect("https:www.baidu.com")
#【urls.py】
urlpatterns = [
#用户登录
path('login/', views.login),
]
#【views.py】
def login(request):
# 根据请求方式返回不同的数据
if request.method == "GET":
return render(request, "login.html")
else:
#print(request.POST)
user_name = request.POST.get("user")
password = request.POST.get("pwd")
if user_name == "root" and password == "123": #通过返回的数据进行判断
return redirect("https:www.baidu.com")
else:
return render(request, "login.html",{"error_msg":"用户名或密码错误"}) #向页面传递错误信息
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录title>
head>
<body>
<h1>用户登录h1>
<form method="post" action="/login/">
{% csrf_token %}
<input type="text" name="user" placeholder="用户名">
<input type="password" name="pwd" placeholder="密码">
<input type="submit" value="提交"> <span style="color:red">{{ error_msg }}span>
form>
body>
html>
【注意】:由于django的安全机制,只有在表单中加入
{% csrf_token %}
才可正确传输数据
输入正确账号密码:跳转到百度
输入错误账号密码:重新跳转到本页面,并红色提示账号或密码错误