django开发
开发能力太弱了,学学django的开发….
0x00 环境搭建
生成虚拟环境,在其中的环境配置不会影响主配置
vitualenv
pip install virtualenv
virtualenv my_env //生成虚拟目录
source my_env/bin/activate //激活环境
source my_env/bin/deactivate //禁用
Django
pip install Django === 2.0.5
django-admin startproject d3vil_pylearn //生成项目
python manage.py migrate //生成对应数据表
python manage.py runserver
__init_文件,将该目录视为一个模块
_setting.py,项目设置
_urls.py,项目路由
_wsgi.py,服务器网关接口运行项目
到此就创建了django的框架,接下来我们要在此框架上进行功能的完善。
python manage.py startapp blog
admin.py 注册模型
apps.py 主要配置
migrations 数据库迁移,跟踪模块变化,同步数据库
models.py 数据模型
tests.py 测试
views.py 接收请求,响应视图
初步了解django后,发现其mvc思想随处可见,setting.py里面包含了需要的配置文件,在migrate时主要针对此中的app进行数据库表的配置,而每一个app中又有个model来进行数据模型的定义,均用一个model类的子类来进行定义,封装了一些诸如datetimeField,CharField等的数据结构定义。view来进行显示
在进行完model的数据模型设计后,我们将这个app引入到我们的项目设置中来再
python manage.py makemigrations polls
就可以完成数据表建立
python manage.py sqlmigrate polls 0001
不对,只是生成了对应的migration文件,现在这个是搞对应的sql语句
看来django通过这个来实现可移植性
BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMEN
T, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id"
integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEF
ERRED);
INSERT INTO "polls_choice" ("id", "choice_text", "votes", "question_id") SELE
CT "id", "choice_text", "votes", NULL FROM "polls_choice__old";
DROP TABLE "polls_choice__old";
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question
_id");
COMMIT;
Then execute migrate to execute sql.
然后是数据库的操作
在建立好数据库后,查询操作如下
from polls.models import Choice, Question 引入类
Question.objects.all() 查询类比于select * from 表QUEStion
Question.objects.filter(id=1) select * from Question where id=1
Question.objects.filter(question_text__startswith='What')
Question.objects.get(pub_date__year=current_year)
注意get和filter方法不同,get能把对象取出来然后才能调用这个方法
因为关系数据的原因,choice里的question是Question的外键,接下来迷惑操作警告
q.choice_set.all() 查询Question对象的choice对象
q.choice_set.create(choice_text='Not much', votes=0) 设置一个
c = q.choice_set.create(choice_text='Just hacking again', votes=0)
c是一个choice对象确可以调用related objects,可能是用的子类实现外键?
>>> c.question
<Question: What's up?>
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
c.delete()就可以
创造管理员
$ python manage.py createsuperuser
但我们的admin管理页面里还没有我们的polls数据,
from django.contrib import admin
# Register your models here.
from .models import Question
admin.site.register(Question)
这样在admin.py里注册我们的模型,就可以在后台中进行管理
踩了个坑,显示旧表不存在,更新了下django,3.10就可以了
嗯,今天就这样,明天开始对这个投票程序的view进行创建
总结下,今天开始了django的学习,这个框架非常的灵活,且mvc的思想随处可见,项目的配置文件主要由setting.py进行配置,应用了哪个app,而对应的数据模型在各个app的model里进行设计修改,会先对model进行生成迁移的操作,我们也可以在执行前看到sql语句,总的操作均通过migrate来操作。然后也是数据表的操作靠model里面的数据对象类来实现,对象之间可以用外键建立联系,子类执行父类方法。然后是管理员界面可对数据进行直接操作。
视图
今天开始视图部分的学习,估了一天,昨天去挖asrc了,这两天学了xss不少,原来以为htmlspecialchar之后就无解了,原来一个实体化就饶过了….每天亿点点学习….
好回归正题。
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
首先在view.py里创造不同的路由函数
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
在url.py中加入我们的路由
只要我们的url对应了url.py里面的参数,就会去调用对应的函数处理相应的请求,同理访问/polls/5/results/就会调用results函数。
试下xss?emmm,是int型的,不得行
嗯,把对应接口改成str后就可以x了,不会真有菜鸟开发员这样写吧?不会吧不会吧。
有了视图后,怎么更方便更好看呢??
模板。
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
emmm,试了下放在text那里咋不行馁…..
嗯,睡了睡了。。。mmp最后这个模型是懵逼的慢慢做两个应用吧。。。
明天开始做blog app
Blog
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!