python -m django --version 会显示版本号
打开命令行,cd到一个你想放置代码的目录 然后运行以下命令
$ django-admin startproject mysite(项目名称)
这行代码将会在当前目录下创建一个mysite的目录
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
这些目录和文件的用处是:
$ python manage.py runserver
会看到如下输出:
Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
十二月 07, 2021 - 15:50:53
Django version 3.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
默认情况下 runserver命令会将服务器设置为监听本机内部IP的8000端口
如果要更换
python manage.py runserver 端口号码
如果你想要其他电脑展示你的成果时使用
python manage.py runserver 0:8000
0是0.0.0.0的简写
在Django中,每一个应用都是一个python包,并且遵循相同的约定,django自带一个工具,可以帮你生成应用的基础目录结构
项目和vs应用
项目和应用的区别
应用是一个专门做某件事的网络应用程序--比如博客系统,或者公共记录的数据库,或者小型的投票系统。项目则是一个网站使用的配置和应用的集合。项目可以包含很多个应用,应用可以被很多个项目使用
请确定你现在处于 manage.py 所在的目录下,然后运行这行命令来创建一个应用:
$ python manage.py startapp polls(应用名称)
这将会创建一个polls目录,它的目录结构大致如下:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
这个目录结构包括了投票应用的全部内容。
polls/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("hello,world.You re at the polls index")
这是Djangou中最简单的视图,如果想看见效果,我们需要将一个url映射到它,这就是我们需要URLconf的原因了。
为了创建URLconf,请在polls目录新建一个urls.py 你的应用目录现在看起应该这样
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
在polls/urls.py中,输入如下代码:
from django.urls import path
from . import views
urlpatterns = [
path("",views.index,name="index"),
]
下一步是要把URLconf文件中指定我们创建的polls.urls模块 在mysite/urls.py的文件中urlpatterns列表插入一个include( ) 如下
mysite/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
函数include( )允许引用其他的URLconfs。每当Django遇到include( )时候,它会截断此项匹配的URL的部分并将剩余的字符串发送到 URLconf 以供进一步处理。
我们设计 include() 的理念是使其可以即插即用。因为投票应用有它自己的 URLconf( polls/urls.py ),他们能够被放在 “/polls/” , “/fun_polls/” ,"/content/polls/",或者其他任何路径下,这个应用都能够正常工作。
函数path( )具有四个参数,两个必须参数route和view,两个可选参数:kwargs和name。
route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。
这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求 https://www.example.com/myapp/ 时,它会尝试匹配 myapp/ 。处理请求 https://www.example.com/myapp/?page=3 时,也只会尝试匹配 myapp/。
当jango找到了一个匹配的准则,就会调用这个特点的视图函数,并传入一个HttpRequest对象作为第一个参数,被捕获的参数以关键字参数
任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。
默认情况下 配置使用SQlite。若不使用SQlite作为数据库,则需要额外设置,例如USER PASSWORD和HOST必须加入
其中ENGINE设置为数据库后端使用内置数据库后端有:
ENGINE – 可选值有
在 项目/settings.py文字中,通过DATABASES项目进行数据库设置
DATABASES = {
"default":{
"ENGINE":"django.db.backends.mysql",
"NAME":"mydemo",#库名
"USER":"root",
"PASSWORD": "",
"HOST":"localhost",
"PROT":"3306",
}
}
我们使用Django、flask等来操作MySQL,实际上底层还是通过Python来操作的。因此我们想要用Django来操作MySQL,首先还是需要安装一个驱动程序。在Python3中,驱动程序有多种选择。比如有pymysql以及mysqlclient等。
网址地址 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 下载对应版本 python版本和型号
pip install --user 位置\mysqlclient.whl
在polls 里面的models.py 模块中
class Stu(models.Model):
#类的属性对应数据库的数据类型
id=models.AutoField(primary_key=True)
names = models.CharField(max_length=20)
def __str__(self):
return "%d:%s"%(self.id,self.names)
#自定义对应的表明,默认表名
class Meta:
db_table = "g1"
在myweb中的settings.py中设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "db1",
"USER":"root",
"PASSWORD": "",
"HOST":"localhost",
"PROT":"3306",
}
}
INSTALLED_APPS = [
#写入应用名.apps.PollsConfig
'polls.apps.PollsConfig',
]
python manage.py shell #打开
from polls.models import Stu #引入类
mod = Stu.objects
mod.get(id) 获取一项
dataall= mod.all( ) for i in dataall: print(i) #获取所有项
from polls.models import Stu #引入模块
mod=Stu.objects
#mod.get( ) 获取单项数据 mod.all( )获取全部数据
print(mod)
python manage.py createsuperuser 密码至少8位
LANGUAGE_CODE = "zh-hans"
TIME_ZONE = "Asia/Shanghai"
打开 myapp/amin.py
from polls.models import Stu
admin.site.register(Stu)
暂时省略
一个干净优雅的URL方案是高质量web应用程序中的一个重要细节。
Django可以让你自己设置URL,无论你想要什么,没有框架限制
为了给一个应用设置URL,你需要创建一个python模块,通常被称为URLconf(URLconfiguration)
这个模块是纯Python代码,是一个简单的Python模式(简单的正则表达式)到Python函数(您的视图)之间的映射。
当用户从Django的站点请求页面时,Django系统遵循以下步骤来执行python代码:
首先Django确定要使用的根URLconf模块,通过ROOT_URLCONF来设置,具体在settings.py配置文件中。但是如果传入HttpRequest 对象具有urlconf属性(由中间件设置),则其值将用于替换ROOT_URLCONF设置。
Django加载该Python模块并查找该变量 urlpatterns。它是django.urls.path()和(或)django.urls.re_path()实例的序列(sequence)。
Django按顺序运行每个URL模式,并在匹配所请求的URL的第一个URL中停止。
一旦正则表达式匹配,Django将导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。该视图会获得如下参数:
如果没有正则表达式匹配,或者在此过程中的任何一点出现异常,Django将调用适当的错误处理视图。
str
-匹配任何非空字符串,但路径分隔符除外’/’。如果表达式中不包含转换器,则为默认设置。int
-匹配零或任何正整数。返回一个int。slug
-匹配由ASCII字母或数字以及连字符和下划线字符组成的任何条形字符串。例如, building-your-1st-django-site。uuid
-匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号并且字母必须小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。path
-匹配任何非空字符串,包括路径分隔符 ‘/’。这样,您就可以匹配完整的URL路径,而不是像一样匹配URL路径的一部分str。注意:url路由,由上而下 进行匹配,如果在上面就匹配成功,则不会向下匹配
通过浏览器访问服务
127.0.0.1:8000/abc ==> root url(根路由) ==> 加载子路由(myweb/urls.py)
==> 正则匹配访问的路径(path) =-=> 视图函数(views.index)
==> views.py index() 响应内容
re_path()
代替path()
。(?Ppattern)
,其中name
是组的名称,并且 pattern是匹配的某种模式。from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P[0-9]{4})/$' , views.year_archive),
re_path(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$' , views.month_archive),
re_path(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[\w-]+)/$' , views.article_detail),
]
字符串
发送到视图。(?P[0-9]{4})
,您还可以使用较短的未命名组(例如)([0-9]{4})
。不建议特别使用此用法
,因为这样可以更轻松地在匹配的预期含义和视图的参数之间意外引入错误。# URLconf
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.page),
path('blog/page/' , views.page),
]
# View (in blog/views.py)
def page(request, num=1):
# Output the appropriate page of blog entries, according to num.
...
当Django找不到与请求的URL匹配的正则表达式时,或者异常引发时,Django将调用错误处理视图。
用于这些情况的视图由四个变量指定。它们的默认值对于大多数项目都是足够的,但通过覆盖其默认值可以进一步定制。
有关详细信息,请参阅自定义错误视图的文档。
这样的值可以在你的根URLconf中设置。在任何其他URLconf中设置这些变量将不起作用。
值必须是可调用的,或者代表视图的完整的Python导入路径的字符串,应该被调用来处理手头的错误条件。
变量是:
templates
,并且在此目录下创建一个404.html
文件在视图函数中也可以指定返回一个404
views.py
注意 Http404需要在django.http的模块中引入
from django.http import Http404
# 响应404
raise Http404('纳尼a')
纳尼a会匹配到404.html中的exception
在模板中 404.html
404
404 not found
{ { exception } }
在任何时候,您
urlpatterns
都可以“包含”其他URLconf模块。这实质上是将一组网址“植根于”其他网址之下
例如,下面是Django网站本身的URLconf的摘录。它包含许多其他URLconf:
from django.urls import include, path
urlpatterns = [
# ... snip ...
path('community/', include('aggregator.urls')),
path('contact/', include('contact.urls')),
# ... snip ...
]
include()
(django.urls.include()
)时,它会截断与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以供进一步处理。如果在视图、模板中使用硬编码的链接,在urlconf发生改变时,维护是一件非常麻烦的事情
from django.urls import path
from . import views
urlpatterns = [
#...
path('articles//' , views.year_archive, name='news-year-archive'),
#...
]
<a href="{ % url 'news-year-archive' 2020 % }">2020 Archivea>
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archivea>li>
{% endfor %}
ul>
from django.http import HttpResponseRedirect
from django.urls import reverse
def redirect_to_year(request):
# ...
year = 2019
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
from django.shortcuts import redirect
from django.urls import reverse
def index(request):
year = 2019
return redirect(reverse('ews-year-archive',args=(year,)))